Skip to content

test(agentic-ai): refactor e2e tests to framework agnostic approach#7463

Open
nikonovd wants to merge 5 commits into
mainfrom
agentic-ai/wiremock-e2e-tests
Open

test(agentic-ai): refactor e2e tests to framework agnostic approach#7463
nikonovd wants to merge 5 commits into
mainfrom
agentic-ai/wiremock-e2e-tests

Conversation

@nikonovd

@nikonovd nikonovd commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

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 through RecordedLlmConversation.
The real LangChain4j OpenAiChatModel executes the full HTTP round-trip in every test.

Framework-agnostic refactoring

  • AiAgentToolSpecifications interface with record ExpectedTool(String name, String description) replaces Langchain4JAiAgentToolSpecifications and its LangChain4j ToolSpecification constants
  • AiAgentA2aIntegrationTestSupport with record A2aExpectedConversation(...) replaces the List<ChatMessage>-returning old helper; callers now receive plain strings
  • ToolCallResultDocumentAssertions updated: ExtractedDocument.contentBlockAssertion changed from Consumer<Content> to Consumer<JsonNode>, unused ChatMessage overload removed, decodeJsonContentBlock eliminated
  • BaseWireMockL4JAiAgentConnectorTest + BaseWireMockL4JAiAgentJobWorkerTest merged into the new BaseAiAgentConnectorTest / BaseAiAgentJobWorkerTest in flattened packages with a single inheritance level
  • All test classes renamed L4JAiAgent* to AiAgent* and moved away from langchain4j package.{outboundconnector,jobworker,wiremock,common} to {outboundconnector,jobworker,wiremock,common}
  • Zero dev.langchain4j.* imports remain in test code

Related issues

closes #7400

Checklist

  • Backport labels are added if these code changes should be backported. No backport label is added to the latest
    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.
    • or backport release-8.8.7: for changes that should be included in the specific release 8.8.7, and this
      release 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.
  • Tests/Integration tests for the changes have been added if applicable.
  • If the change requires a documentation update, it has been added to the appropriate section in the documentation.

@nikonovd nikonovd self-assigned this Jun 9, 2026
Copilot AI review requested due to automatic review settings June 9, 2026 12:40
@nikonovd nikonovd requested review from a team as code owners June 9, 2026 12:40
@nikonovd nikonovd requested a review from ztefanie June 9, 2026 12:40

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 via RecordedLlmConversation.
  • Renamed/moved E2E test packages from langchain4j/... to framework-neutral aiagent/... and removed dev.langchain4j.* imports from tests.
  • Refactored agent request handling to compose inputs via AgentInputComposer, enforce limits via AgentConversation.checkLimits, and pass a framework-neutral ConversationSnapshot into 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 throw IndexOutOfBoundsException when the conversation contains only a leading SystemMessage and maxMessages is 0 (or otherwise less than the effective count). The current logic sets messageToEvictIndex = 1 to preserve the system message, but if the list size is 1 there is nothing to evict. Also, negative maxMessages currently leads to hard-to-diagnose failures rather than a clear validation error.

@nikonovd nikonovd force-pushed the agentic-ai/wiremock-e2e-tests branch from 7cad51b to 6b3c388 Compare June 9, 2026 12:50
@nikonovd nikonovd force-pushed the agentic-ai/wiremock-e2e-tests branch from 6b3c388 to 7f96eff Compare June 9, 2026 12:52
@nikonovd nikonovd removed the request for review from ztefanie June 9, 2026 12:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Update e2e tests to use HTTP mocking/Wiremock instead of Mockito mocks

2 participants