test(agentic-ai): refactor e2e tests to framework agnostic approach#7463
Open
nikonovd wants to merge 5 commits into
Open
test(agentic-ai): refactor e2e tests to framework agnostic approach#7463nikonovd wants to merge 5 commits into
nikonovd wants to merge 5 commits into
Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This PR refactors the Agentic AI connector’s E2E test suite to be framework-agnostic by stubbing the LLM at the HTTP transport layer (WireMock) and asserting against recorded OpenAI-compatible request bodies, while also reshaping parts of the agent execution pipeline around an AgentConversation aggregate + ConversationSnapshot to reduce framework-specific coupling.
Changes:
- Replaced Mockito/LangChain4j in-process LLM mocking with WireMock stubs (
/v1/chat/completions) and request-body assertions viaRecordedLlmConversation. - Renamed/moved E2E test packages from
langchain4j/...to framework-neutralaiagent/...and removeddev.langchain4j.*imports from tests. - Refactored agent request handling to compose inputs via
AgentInputComposer, enforce limits viaAgentConversation.checkLimits, and pass a framework-neutralConversationSnapshotinto the AI framework adapter.
Reviewed changes
Copilot reviewed 98 out of 98 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| e2e-test-refactoring-handoff.md | Internal handoff notes describing the WireMock-based migration approach and remaining TODOs. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/autoconfigure/AgenticAiConnectorsAutoConfigurationTest.java | Updates auto-config test expectations after removing/replacing beans. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/systemprompt/SystemPromptComposerImplTest.java | Updates system prompt composition tests to use AgentConversation instead of mocked execution/context types. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/model/TurnReconstructorTest.java | Adds tests for reconstructing turns/system message/iterationKey from a flat message list. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/model/ConversationTurnTest.java | Adds unit tests for ConversationTurn.hasToolCalls(). |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/model/AgentConversationTest.java | Adds unit tests for conversation rehydration, ingestion, message windows, and limits checks. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/memory/runtime/MessageWindowFilterTest.java | Adds unit tests for new static message window filtering behavior. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/memory/runtime/DefaultRuntimeMemoryTest.java | Removes tests for deleted runtime memory implementation. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/agent/ValidationResultTest.java | Adds tests for the new ValidationResult value object. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/agent/AgentResponseHandlerTest.java | Updates response handling tests for the new conversation-based response API and tool-call transform hook. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/agent/AgentLimitsValidatorTest.java | Removes tests for deleted AgentLimitsValidator implementation. |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/aiagent/agent/AgentInputComposerImplTest.java | Adds unit tests for composing first-turn input vs tool-result turns (proceed/no-op/cancel). |
| connectors/agentic-ai/src/test/java/io/camunda/connector/agenticai/a2a/client/agentic/tool/systemprompt/A2aSystemPromptContributorTest.java | Updates A2A system prompt contributor tests to the new SystemPromptContributor API (AgentConversation). |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/autoconfigure/AgenticAiConnectorsAutoConfiguration.java | Rewires beans: replaces limits/messages handler beans with AgentInputComposer, updates request handler wiring, updates response handler wiring. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/systemprompt/SystemPromptContributor.java | Refactors contributor API to accept AgentConversation. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/systemprompt/SystemPromptComposer.java | Refactors composer API to accept AgentConversation. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/systemprompt/SystemPromptComposerImpl.java | Implements conversation-based prompt composition and base prompt extraction from AgentConfiguration. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/model/TurnReconstructor.java | Adds utility to rebuild ConversationTurns + leading system message from stored message history. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/model/ConversationTurn.java | Introduces per-turn domain record (input messages, assistant message, metrics, iteration key). |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/model/AgentInvocationInput.java | Introduces per-invocation input record (user prompt + engine tool results). |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/model/AgentConfiguration.java | Introduces immutable per-invocation configuration snapshot built from AgentExecutionContext. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/memory/runtime/RuntimeMemory.java | Removes framework-coupled runtime memory abstraction. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/memory/runtime/DefaultRuntimeMemory.java | Removes runtime memory implementation. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/memory/runtime/MessageWindowFilter.java | Extracts windowing into a static utility used by AgentConversation.window(). |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/memory/ConversationSnapshot.java | Adds framework-neutral snapshot of filtered messages + tool definitions for an LLM invocation. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/framework/AiFrameworkAdapter.java | Refactors adapter API to accept ConversationSnapshot. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/framework/AiFrameworkChatResponse.java | Refactors response contract to return assistant message + token usage (not an updated AgentContext). |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/framework/langchain4j/Langchain4JAiFrameworkAdapter.java | Updates LangChain4j adapter to operate on ConversationSnapshot and return token usage for ingestion. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/framework/langchain4j/Langchain4JAiFrameworkChatResponse.java | Updates framework chat response payload to assistant + token usage + raw response. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/AgentInput.java | Introduces sealed decision type for composed input: Proceed/NoOp/Cancel. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/AgentInputComposer.java | Introduces interface for composing next-turn input from conversation state. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/AgentResponseHandler.java | Refactors response handler API to accept AgentConversation. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/AgentResponseHandlerImpl.java | Updates response creation to pull assistant/tool-calls/config from AgentConversation and apply tool-call transformations. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/ValidationResult.java | Adds value object used for limits validation reporting. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/OutboundConnectorAgentRequestHandler.java | Adapts outbound handler hooks to conversation-based base class; handles input cancellation by throwing ConnectorException. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/JobWorkerAgentRequestHandler.java | Adapts job-worker handler hooks to conversation-based base class; handles input cancellation by completing without response and updates interruption logic to use pending input messages. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/AgentMessagesHandler.java | Removes messages handler abstraction now superseded by AgentInputComposer/AgentConversation. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/AgentLimitsValidator.java | Removes legacy limits validator abstraction now superseded by AgentConversation.checkLimits(). |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/agent/AgentLimitsValidatorImpl.java | Removes legacy limits validator implementation. |
| connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/a2a/client/agentic/tool/systemprompt/A2aSystemPromptContributor.java | Updates A2A contributor to read properties via AgentConversation/base context. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/resources/regression/ai-agent-task.bpmn | Switches regression BPMN mapping to openaiCompatible provider + endpoint indirection for WireMock. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/resources/regression/ai-agent-task-8.8.0.bpmn | Same provider remapping for 8.8.0 regression BPMN. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/resources/regression/ai-agent-process.bpmn | Switches job-worker regression BPMN mapping to openaiCompatible provider + endpoint indirection for WireMock. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/resources/regression/ai-agent-process-8.8.0.bpmn | Same provider remapping for 8.8.0 job-worker regression BPMN. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/assertj/ToolExecutionResultMessageEqualsPredicate.java | Removes LangChain4j-specific assertion predicate (no longer needed under wire-level JSON assertions). |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/assertj/ToolExecutionRequestEqualsPredicate.java | Removes LangChain4j-specific assertion predicate (no longer needed under wire-level JSON assertions). |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/wiremock/OpenAiChatModelStubs.java | Adds WireMock stubbing utilities for deterministic multi-turn OpenAI-compatible chat completions. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/wiremock/RecordedLlmConversation.java | Adds helper to parse and inspect recorded WireMock requests as JSON (replacing ArgumentCaptor<ChatRequest>). |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/ToolCallResultDocumentAssertions.java | Refactors document assertions to operate on OpenAI wire-format JSON instead of LangChain4j message/content types. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/outboundconnector/AiAgentConnectorResponseHandlingTests.java | Refactors response-format assertions to read recorded response_format JSON from WireMock requests. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/outboundconnector/AiAgentConnectorProcessMigrationTests.java | Refactors process migration test from Mockito to WireMock stubs + recorded-request tool assertions. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/outboundconnector/AiAgentConnectorMemoryStorageTests.java | Refactors memory storage tests to use WireMock stubs while preserving spy-based side-effect verification. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/outboundconnector/AiAgentConnectorLimitsTests.java | Refactors limits tests to use repeating WireMock turns and queued feedback instead of Mockito loops. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/outboundconnector/AiAgentConnectorHttpTimeoutTests.java | Keeps timeout tests WireMock-driven while bypassing the base class provider redirect to test other providers. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/outboundconnector/AiAgentConnectorFeedbackLoopTests.java | Refactors feedback-loop test to use WireMock multi-turn stubs + queued feedback and request-body assertions. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/outboundconnector/AiAgentConnectorElementTemplateRegressionTests.java | Adds/updates regression tests against versioned BPMN templates using wire-level conversation assertions. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/outboundconnector/AiAgentConnectorAgentInstanceTests.java | Updates agent instance status/metric assertions while keeping WireMock HTTP stubbing. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/langchain4j/outboundconnector/L4JAiAgentConnectorUserPromptDocumentsTests.java | Removes LangChain4j-specific user-prompt document tests (replaced by framework-neutral equivalents). |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/langchain4j/outboundconnector/L4JAiAgentConnectorElementTemplateRegressionTests.java | Removes LangChain4j-specific element-template regression test variant. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/langchain4j/jobworker/L4JAiAgentJobWorkerUserPromptDocumentsTests.java | Removes LangChain4j-specific job-worker user-prompt document tests. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/langchain4j/jobworker/L4JAiAgentJobWorkerElementTemplateRegressionTests.java | Removes LangChain4j-specific job-worker regression test variant. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/jobworker/AiAgentJobWorkerVariableScopeTests.java | Refactors variable-scope tests to WireMock stubs + queued feedback (and composes provider redirect where needed). |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/jobworker/AiAgentJobWorkerResponseHandlingTests.java | Refactors job-worker response handling tests to assert recorded response_format JSON. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/jobworker/AiAgentJobWorkerProcessMigrationTests.java | Refactors job-worker migration tests from Mockito to WireMock stubs + recorded-request assertions. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/jobworker/AiAgentJobWorkerMemoryStorageTests.java | Refactors job-worker memory storage tests to WireMock stubs while preserving spy-based verification. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/jobworker/AiAgentJobWorkerLimitsTests.java | Refactors job-worker limits tests to repeating WireMock stubs + queued feedback. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/jobworker/AiAgentJobWorkerFeedbackLoopTests.java | Refactors job-worker feedback-loop test to WireMock stubs + recorded-request assertions. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/jobworker/AiAgentJobWorkerElementTemplateRegressionTests.java | Adds/updates job-worker regression tests against versioned BPMN templates with wire-level assertions. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/jobworker/AiAgentJobWorkerAgentInstanceTests.java | Updates agent instance status/metric assertions for job-worker flavor while keeping WireMock stubbing. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/common/AiAgentA2aIntegrationTestSupport.java | Refactors A2A support to return a framework-agnostic expected conversation record (strings) rather than LangChain4j message objects. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/BaseAiAgentTest.java | Adds queued feedback support and exposes WireMock runtime info to enable HTTP-level stubbing across tests. |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/BaseAiAgentJobWorkerTest.java | Removes old base test class (replaced by new base under aiagent/jobworker/). |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/BaseAiAgentConnectorTest.java | Removes old base test class (replaced by new base under aiagent/outboundconnector/). |
| connectors-e2e-test/connectors-e2e-test-agentic-ai/src/test/java/io/camunda/connector/e2e/agenticai/aiagent/AiAgentToolSpecifications.java | Adds framework-neutral expected tool specs (ExpectedTool) for request-body tool assertions. |
Comments suppressed due to low confidence (1)
connectors/agentic-ai/src/main/java/io/camunda/connector/agenticai/aiagent/memory/runtime/MessageWindowFilter.java:33
MessageWindowFilter.apply()can throwIndexOutOfBoundsExceptionwhen the conversation contains only a leadingSystemMessageandmaxMessagesis 0 (or otherwise less than the effective count). The current logic setsmessageToEvictIndex = 1to preserve the system message, but if the list size is 1 there is nothing to evict. Also, negativemaxMessagescurrently leads to hard-to-diagnose failures rather than a clear validation error.
…mcp mockito mocks
7cad51b to
6b3c388
Compare
6b3c388 to
7f96eff
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Motivation
The previous e2e test suite mocked the LLM at the Java level (Mockito ChatModel + ArgumentCaptor), which bypassed LangChain4j's HTTP transport entirely. The tests also carried LangChain4j-specific class names and types throughout, making them useless as regression baselines when switching AI frameworks.
What changed
WireMock LLM transport (was: Mockito mock)
All 20 L4JAiAgent* test classes now stub the LLM at the HTTP level via
OpenAiChatModelStubs(POST /v1/chat/completions) and verify recorded requests throughRecordedLlmConversation.The real LangChain4j OpenAiChatModel executes the full HTTP round-trip in every test.
Framework-agnostic refactoring
AiAgentToolSpecificationsinterface withrecord ExpectedTool(String name, String description)replacesLangchain4JAiAgentToolSpecificationsand its LangChain4jToolSpecificationconstantsAiAgentA2aIntegrationTestSupportwithrecord A2aExpectedConversation(...)replaces theList<ChatMessage>-returning old helper; callers now receive plain stringsToolCallResultDocumentAssertionsupdated:ExtractedDocument.contentBlockAssertionchanged fromConsumer<Content>toConsumer<JsonNode>, unusedChatMessageoverload removed,decodeJsonContentBlockeliminatedBaseWireMockL4JAiAgentConnectorTest+BaseWireMockL4JAiAgentJobWorkerTestmerged into the newBaseAiAgentConnectorTest/BaseAiAgentJobWorkerTestin flattened packages with a single inheritance levelL4JAiAgent*toAiAgent*and moved away fromlangchain4jpackage.{outboundconnector,jobworker,wiremock,common} to {outboundconnector,jobworker,wiremock,common}dev.langchain4j.*imports remain in test codeRelated issues
closes #7400
Checklist
release, as this branch will be rebased onto main before the next release. Example backport labels:
backport stable/8.8: for changes that should be included in the next 8.8.x release.backport release-8.8.7: for changes that should be included in the specific release 8.8.7, and thisrelease has already been created. The release branch will be merged back into stable/8.8 later, so the change
will be included in future 8.8.x releases as well.