I have an Spring Boot Application with Multiple Camel Routes and I am in the process of testing these routes individually and also some of these routes contains components that are not accessible locally. So I need to mock these Endpoints so they can be tested locally.
But the MockEndpoints defined @EndpointInject("mock:direct:route1-part2")
doesn't start nor do they consume any messages which results in the following error log.
Caused by: org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: direct://route1-part2. Exchange[2CFDECFAA02305C-0000000000000000]
I've tried adding
directPart2MockEndpoint = camelContext.getEndpoint("mock:direct:route1-part2",MockEndpoint.class);
also
directPart2MockEndpoint.start();
It still resulted in the same outcome.
Expected result is the mock endpoint to start and consume messages recieved at direct://route1-part2 and the assertion directPart2MockEndpoint.assertIsSatisfied();
to complete.
Given below is a sample (not the exact route) for the route I created.
package com.missakai.samplecameltesting.camel;
import lombok.extern.slf4j.Slf4j;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.dataformat.JsonLibrary;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class Route1Part1 extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:route1-part1")
.routeId("route1-part1")
.unmarshal().json(JsonLibrary.Jackson)
// set some values for the current exchange
.setProperty("OrderId",simple("${body[orderId]}"))
// doing some preprocessing on the message
.process(exchange -> {
log.info("Executing the preprocessor for order:{}",exchange.getProperty("OrderId"));
// your preprocessing logic. If you do not have any you can remove this .process() block
})
.log("Order consumed and preprocessed for order: ${body}")
.to("direct:route1-part2")
.end();
}
}
And given below is the test class I've written to test the above route.
package com.missakai.samplecameltesting.camel;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.camel.CamelContext;
import org.apache.camel.EndpointInject;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.AdviceWith;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Map;
@CamelSpringBootTest
@EnableAutoConfiguration
@SpringBootTest(
properties = {
// Disable other routes being initialized for testing only this route
"camel.springboot.java-routes-include-pattern=**/Route1Part1*"
}
)
@Slf4j
class Route1Part1Test {
@Autowired
CamelContext camelContext;
@Produce("direct:route1-part1")
ProducerTemplate producerTemplate;
@EndpointInject("mock:direct:route1-part2")
MockEndpoint directPart2MockEndpoint;
static ObjectMapper objectMapper=new ObjectMapper();
@Test
void testRoute() throws Exception {
directPart2MockEndpoint.setExpectedMessageCount(1);
// mock all endpoints
AdviceWith.adviceWith(camelContext, "route1-part1", AdviceWithRouteBuilder::mockEndpoints);
producerTemplate.sendBody(
"direct:route1-part1",
objectMapper.writeValueAsString(Map.of("orderId","ABC0001"))
);
directPart2MockEndpoint.assertIsSatisfied();
}
}
Reproducable Sample Application
The sample application with above code is available at https://github.com/MissakaI/sample-camel-testing
References followed when wrting the test
Full stack trace if required
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.5)
2022-11-21 14:00:29.970 INFO 14532 --- [ main] c.m.s.camel.Route1Part1Test : Starting Route1Part1Test using Java 17.0.3.1 on LAPTOP-JI6B9LOJ with PI
D 14532 (started by midda in D:\Projects-Learning\sample-camel-testing)
2022-11-21 14:00:29.973 INFO 14532 --- [ main] c.m.s.camel.Route1Part1Test : No active profile set, falling back to 1 default profile: "default"
2022-11-21 14:00:34.989 INFO 14532 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator'
2022-11-21 14:00:35.293 INFO 14532 --- [ main] c.m.s.camel.Route1Part1Test : Started Route1Part1Test in 5.751 seconds (JVM running for 7.863)
2022-11-21 14:00:35.412 INFO 14532 --- [ main] o.a.c.t.s.j.CamelAnnotationsHandler : Setting shutdown timeout to [10 SECONDS] on CamelContext with name [cam
elContext].
2022-11-21 14:00:35.678 INFO 14532 --- [ main] c.t.s.j.CamelSpringBootExecutionListener : CamelSpringBootExecutionListener before: class com.missakai.samplecamel
testing.camel.Route1Part1Test.testRoute
2022-11-21 14:00:35.678 INFO 14532 --- [ main] c.t.s.j.CamelSpringBootExecutionListener : Initialized CamelSpringBootExecutionListener now ready to start CamelCo
ntext
2022-11-21 14:00:35.680 INFO 14532 --- [ main] o.a.c.t.s.j.CamelAnnotationsHandler : Starting CamelContext with name [camelContext].
2022-11-21 14:00:36.022 INFO 14532 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 3.18.2 (camel-1) is starting
2022-11-21 14:00:36.048 INFO 14532 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Routes startup (started:1)
2022-11-21 14:00:36.048 INFO 14532 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Started route1-part1 (direct://route1-part1)
2022-11-21 14:00:36.048 INFO 14532 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 3.18.2 (camel-1) started in 486ms (build:119ms init:342ms
start:25ms)
2022-11-21 14:00:36.839 INFO 14532 --- [ main] .c.m.InterceptSendToMockEndpointStrategy : Adviced endpoint [direct://route1-part1] with mock endpoint [mock:direc
t:route1-part1]
2022-11-21 14:00:36.840 INFO 14532 --- [ main] .c.m.InterceptSendToMockEndpointStrategy : Adviced endpoint [direct://route1-part2] with mock endpoint [mock:direc
t:route1-part2]
2022-11-21 14:00:37.853 INFO 14532 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Stopped route1-part1 (direct://route1-part1)
2022-11-21 14:00:37.855 INFO 14532 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Shutdown route1-part1 (direct://route1-part1)
2022-11-21 14:00:37.857 INFO 14532 --- [ main] org.apache.camel.builder.AdviceWith : AdviceWith route after: Route(route1-part1)[From[direct:route1-part1] -
> [Unmarshal[org.apache.camel.model.dataformat.JsonDataFormat@45b8bbbf], SetProperty[OrderId, simple{${body[orderId]}}], process[Processor@0x474619d9], Log[Order consumed a
nd preprocessed for order: ${body}], To[direct:route1-part2]]]
2022-11-21 14:00:37.867 INFO 14532 --- [ main] org.apache.camel.builder.AdviceWith : Adviced route before/after as XML:
<route xmlns="http://camel.apache.org/schema/spring" customId="true" id="route1-part1">
<from uri="direct:route1-part1"/>
<unmarshal allowNullBody="false" id="unmarshal1">
<json library="Jackson"/>
</unmarshal>
<setProperty id="setProperty1" name="OrderId">
<simple>${body[orderId]}</simple>
</setProperty>
<process id="process1"/>
<log id="log1" message="Order consumed and preprocessed for order: ${body}"/>
<to id="to1" uri="direct:route1-part2"/>
</route>
<route xmlns="http://camel.apache.org/schema/spring" customId="true" id="route1-part1">
<from uri="direct:route1-part1"/>
<unmarshal allowNullBody="false" id="unmarshal1">
<json library="Jackson"/>
</unmarshal>
<setProperty id="setProperty1" name="OrderId">
<simple>${body[orderId]}</simple>
</setProperty>
<process id="process1"/>
<log id="log1" message="Order consumed and preprocessed for order: ${body}"/>
<to id="to1" uri="direct:route1-part2"/>
</route>
2022-11-21 14:00:37.868 INFO 14532 --- [ main] .c.m.InterceptSendToMockEndpointStrategy : Adviced endpoint [direct://route1-part1] with mock endpoint [mock:direc
t:route1-part1]
2022-11-21 14:00:37.881 INFO 14532 --- [ main] .c.m.InterceptSendToMockEndpointStrategy : Adviced endpoint [direct://route1-part2] with mock endpoint [mock:direc
t:route1-part2]
2022-11-21 14:00:38.060 INFO 14532 --- [ main] c.m.s.camel.Route1Part1 : Executing the preprocessor for order:ABC0001
2022-11-21 14:00:38.062 INFO 14532 --- [ main] route1-part1 : Order consumed and preprocessed for order: {orderId=ABC0001}
2022-11-21 14:01:08.088 ERROR 14532 --- [ main] o.a.c.p.e.DefaultErrorHandler : Failed delivery for (MessageId: 7410C3F7B378194-0000000000000000 on Exc
hangeId: 7410C3F7B378194-0000000000000000). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers
available on endpoint: direct://route1-part2. Exchange[7410C3F7B378194-0000000000000000]
Message History (source location and message history is disabled)
---------------------------------------------------------------------------------------------------------------------------------------
Source ID Processor Elapsed (ms)
route1-part1/route1-part1 from[direct://route1-part1] 30157
...
route1-part1/to1 direct:route1-part2 0
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: direct://route1-part2. Exchange[7410C3F7B378194-0000000000000000]
at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:82) ~[camel-direct-3.18.2.jar:3.18.2]
at org.apache.camel.processor.InterceptSendToEndpointProcessor.callback(InterceptSendToEndpointProcessor.java:115) ~[camel-core-processor-3.18.2.jar:3.18.2]
at org.apache.camel.processor.InterceptSendToEndpointProcessor$1.process(InterceptSendToEndpointProcessor.java:147) ~[camel-core-processor-3.18.2.jar:3.18.2]
at org.apache.camel.processor.Pipeline$PipelineTask.run(Pipeline.java:106) ~[camel-core-processor-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:189) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:61) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.processor.Pipeline.process(Pipeline.java:182) ~[camel-core-processor-3.18.2.jar:3.18.2]
at org.apache.camel.processor.InterceptSendToEndpointProcessor.process(InterceptSendToEndpointProcessor.java:81) ~[camel-core-processor-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:214) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.SharedCamelInternalProcessor$1.process(SharedCamelInternalProcessor.java:111) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:83) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:108) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:199) ~[camel-support-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:176) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:172) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:153) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:187) ~[camel-base-engine-3.18.2.jar:3.18.2]
at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:195) ~[camel-base-engine-3.18.2.jar:3.18.2]
at com.missakai.samplecameltesting.camel.Route1Part1Test.testRoute(Route1Part1Test.java:51) ~[test-classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) ~[junit-platform-commons-1.8.2.jar:1.8.2]
at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) ~[junit-jupiter-engine-5.8.2.jar:
5.8.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) ~[junit-jupiter-engine-5.8.2.jar
:5.8.2]
at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) ~[junit-jupiter-engine-5.8.2.jar
:5.8.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) ~[junit-jupiter-engine-5.8.2.jar:5.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-pla
tform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-pla
tform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) ~[junit-platfo
rm-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) ~[junit-platform-engine-1.8.2.jar:1.8.2]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220) ~[junit-platform-launcher-1.3.1.jar:1.3.1]
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188) ~[junit-platform-launcher-1.3.1.jar:1.3.1]
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202) ~[junit-platform-launcher-1.3.1.jar:1.3.1]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181) ~[junit-platform-launcher-1.3.1.jar:1.3.1]
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) ~[junit-platform-launcher-1.3.1.jar:1.3.1]
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:150) ~[surefire-junit-platform-2.22.2.jar:2.22.2]
at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:124) ~[surefire-junit-platform-2.22.2.jar:2.22.2]
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384) ~[surefire-booter-2.22.2.jar:2.22.2]
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345) ~[surefire-booter-2.22.2.jar:2.22.2]
at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126) ~[surefire-booter-2.22.2.jar:2.22.2]
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418) ~[surefire-booter-2.22.2.jar:2.22.2]