Test Spring JUnit5
Since Camel 3.0
The camel-test-spring-junit5 module makes it possible to test Camel Spring based applications with JUnit 5.
Testing is a crucial part of any development or integration work. The Spring Framework offers a number of features that makes it easy to test while using Spring for Inversion of Control.
There are multiple approaches to test Camel Spring 5.x based routes with JUnit 5.
Extending the CamelSpringTestSupport class
An approach is to extend org.apache.camel.test.spring.junit5.CamelSpringTestSupport, for instance:
public class SimpleMockTest extends CamelSpringTestSupport {
@EndpointInject("mock:result")
protected MockEndpoint resultEndpoint;
@Produce("direct:start")
protected ProducerTemplate template;
@Override
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("org/apache/camel/test/patterns/SimpleMockTest.xml");
}
@Test
public void testMock() throws Exception {
String expectedBody = "Hello World";
resultEndpoint.expectedBodiesReceived(expectedBody);
template.sendBodyAndHeader(expectedBody, "foo", "bar");
resultEndpoint.assertIsSatisfied();
}
}
This approach provides feature parity with org.apache.camel.test.junit5.CamelTestSupport from camel-test-junit5 but does not support Spring annotations on the test class such as @Autowired, @DirtiesContext, and @ContextConfiguration.
Instead of instantiating the CamelContext and routes programmatically, this class relies on a Spring context to wire the needed components together. If your test extends this class, you must provide the Spring context by implementing the following method.
protected abstract AbstractApplicationContext createApplicationContext();
Using the @CamelSpringTest annotation
Another approach involves the usage of the org.apache.camel.test.spring.junit5.CamelSpringTest annotation, for instance:
@CamelSpringTest
@ContextConfiguration
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class CamelSpringPlainTest {
@Autowired
protected CamelContext camelContext;
@EndpointInject("mock:a")
protected MockEndpoint mockA;
@EndpointInject("mock:b")
protected MockEndpoint mockB;
@Produce("direct:start")
protected ProducerTemplate start;
@Test
public void testPositive() throws Exception {
assertEquals(ServiceStatus.Started, camelContext.getStatus());
mockA.expectedBodiesReceived("David");
mockB.expectedBodiesReceived("Hello David");
start.sendBody("David");
MockEndpoint.assertIsSatisfied(camelContext);
}
@Test
public void testAnotherCase() throws Exception {
...
}
}
The above test will load the route from org/apache/camel/test/spring/CamelSpringPlainTest-context.xml which looks like below:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
<camelContext id="camelContext"
xmlns="http://camel.apache.org/schema/spring" trace="true"
autoStartup="true">
<packageScan>
<package>org.apache.camel.test.spring</package>
</packageScan>
<route>
<from uri="direct:start" />
<to uri="mock:a" />
<transform>
<simple>Hello ${body}</simple>
</transform>
<to uri="mock:b" />
</route>
</camelContext>
<bean id="bridgePropertyPlaceholder"
class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer">
<property name="location"
value="classpath:org/apache/camel/test/spring/test.properties" />
</bean>
</beans>
This approach supports both Camel and Spring annotations, such as @Autowired, @DirtiesContext, and @ContextConfiguration.
However, it does NOT have feature parity with org.apache.camel.test.junit5.CamelTestSupport.
Migrating Camel Spring Tests from JUnit 4 to JUnit 5
Find below some hints to help in migrating Camel Spring tests from JUnit 4 to JUnit 5.
Referencing the Camel Test Spring JUnit 5 library in your project
Projects using camel-test-spring would need to use camel-test-spring-junit5. For instance, maven users would update their pom.xml file as below:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-test-spring-junit5</artifactId> <scope>test</scope> </dependency>
Tips: It’s possible to run JUnit 4 & JUnit 5 based Camel Spring tests side by side including the following dependencies camel-test-spring,
camel-test-spring-junit5 and junit-vintage-engine. This configuration allows to migrate a Camel Spring test at once.
Typical migration steps linked to JUnit 5 support in Camel Test Spring
-
Migration steps linked to JUnit 5 support in Camel Test itself should have been applied first
-
Imports of
org.apache.camel.test.spring.*should be replaced withorg.apache.camel.test.spring.junit5.* -
Usage of
@RunWith(CamelSpringRunner.class)should be replaced with@CamelSpringTest -
Usage of
@BootstrapWith(CamelTestContextBootstrapper.class)should be replaced with@CamelSpringTest -
Usage of
@RunWith(CamelSpringBootRunner.class)should be replaced with@CamelSpringBootTest