Testing is a crucial part of any development or integration work. In case you're using the Camel CDI integration for your applications, you have a number of options to ease testing.
You can use CDI for IoC and the Camel testing endpoints like DataSet
, Mock
, Test
and testing API like AdviceWith
and NotifyBuilder
to create sophisticated integration/unit tests that are easy to run and debug inside your IDE.
There are two supported approaches for testing with CDI in Camel:
Name | Testing Frameworks Supported | Description |
---|---|---|
Camel CDI Test |
| Available as of Camel 2.17 The Camel CDI test module ( |
Arquillian |
| Arquillian is a testing platform that handles all the plumbing of in-container testing with support for a wide range a target containers. |
Camel CDI Test
With this approach, your test classes use the JUnit test runner provided in Camel CDI test. This runner manages the lifecycle of a standalone CDI container and automatically assemble and deploy the System Under Test (SUT) based on the classpath into the container.
It deploys the test class as a CDI bean so that dependency injection and any CDI features is available within the test class.
Maven users will need to add the following dependency to their pom.xml
for this component:
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-test-cdi</artifactId> <scope>test</test> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
Here is a simple unit test using the CamelCdiRunner
:
@RunWith(CamelCdiRunner.class) public class CamelCdiRunnerTest { @Inject CamelContext context; @Test public void test() { assertThat("Camel context status is incorrect!", context.getStatus(), is(equalTo(ServiceStatus.Started))); } }
Arquillian
@RunWith(Arquillian.class) public class CamelCdiJavaSeTest { @Deployment public static Archive deployment() { return ShrinkWrap.create(JavaArchive.class) // Camel CDI .addPackage(CdiCamelExtension.class.getPackage()) // Test classes .addPackage(Application.class.getPackage()) // Bean archive deployment descriptor .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"); } @Inject CamelContext context; @Test public void test() { assertThat("Camel context status is incorrect!", context.getStatus(), is(equalTo(ServiceStatus.Started))); } }
@RunWith(Arquillian.class) public class CamelCdiWebTest { @Deployment public static Archive<?> createTestArchive() { return ShrinkWrap.create(WebArchive.class) .addClass(Application.class) .addAsWebInfResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml")) .setWebXML(Paths.get("src/main/webapp/WEB-INF/web.xml").toFile()); } @Test @RunAsClient public void test(@ArquillianResource URL url) throws Exception { assertThat(IOHelper.loadText(new URL(url, "camel/rest/hello").openStream()), is(equalTo("Hello World!\n"))); } }
Test patterns
Routes advising with adviceWith
AdviceWith
is used for testing Camel routes where you can advice an existing route before its being tested. It allows to add Intercept or weave routes for testing purpose, for example using the Mock component.
It is recommended to only advice routes which are not started already. To meet that requirement, you can use the CamelContextStartingEvent
event by declaring an observer method in which you use adviceWith
to add a mock
endpoint at the end of your Camel route, e.g.:
void advice(@Observes CamelContextStartingEvent event, @Uri("mock:test") MockEndpoint messages, ModelCamelContext context) throws Exception { context.getRouteDefinition("route") .adviceWith(context, new AdviceWithRouteBuilder() { @Override public void configure() { weaveAddLast().to("mock:test"); } }); }
See Also
- CDI Web site
- CDI ecosystem
- Going further with CDI (See Camel CDI section)