...
Camel is a Java library so you can easily wire up tests in whatever unit testing framework you use (JUnit 3.x (deprecated), 4.x, or TestNG). However the Camel project has tried to make the testing of Camel as easy and powerful as possible so we have introduced the following features.
Testing
...
Mechanisms
The following mechanisms are supported:
Name | Component | Description | ||
---|---|---|---|---|
| Is a standalone Java is a library letting you easily create Camel test cases using a single Java class for all your configuration and routing without using CDI, Spring or Guice for Dependency Injection which which does not require an in-depth knowledge of Spring + SpringTest or Guice | |||
uses Spring Test together with either XML or Java Config to dependency inject your test classes | ||||
Spring Test or Guice. Supports JUnit 3.x (deprecated) and JUnit 4.x based tests. | ||||
CDI Testing | camel-test-cdi | Provides a JUnit 4 runner that bootstraps a test environment using CDI so that you don't have to be familiar with any CDI testing frameworks and can concentrate on the testing logic of your Camel CDI applications. Testing frameworks like Arquillian or PAX Exam, can be used for more advanced test cases, where you need to configure your system under test in a very fine-grained way or target specific CDI containers. | ||
| Supports JUnit 3.x (deprecated) or JUnit 4.x based tests that bootstrap a test environment using Spring without needing to be familiar with Spring Test. The plain JUnit 3.x/4.x based tests work very similar to the test support classes in Also supports Spring Test based tests that use the declarative style of test configuration and injection common in Spring Test. The Spring Test based tests provide feature parity with the plain JUnit 3.x/4.x based testing approach. Note: | |||
| Camel 2.10: Provides the ability to do unit testing on blueprint configurations | |||
| Deprecated Uses | uses Guice to dependency inject your test classes | ||
Camel TestNG |
| Deprecated Supports plain TestNG based tests with or without CDI, Spring or Guice for Dependency Injection which does not require an in-depth knowledge of CDI, Spring + Spring Test or Guice. From Camel 2.10: this component supports Spring Test based tests that use the declarative style of test configuration and injection common in Spring Test and described in more detail under Spring Testing. |
In all approaches the test classes look pretty much the same in that they all reuse the Camel binding and injection annotations.
Camel Test Example
Here is the Camel Test example.
...
:
...
...
Notice how it derives from the Camel helper class CamelTestSupport
but has no CDI, Spring or Guice dependency injection configuration but instead overrides the createRouteBuilder()
method.
CDI Test Example
Here is the CDI Testing example:camel-example-cdi-test
example and the test classes that come with it.
Spring Test with XML Config Example
Here is the Spring TestTestingexample using XML Config.
...
:
...
...
Notice that we use @DirtiesContext
on the test methods to force Spring TestTesting to automatically reload the CamelContext
after each test method - this ensures that the tests don't clash with each other (, e.g., one test method sending to an endpoint that is then reused in another test method).
Also notice note the use of @ContextConfiguration
to indicate that by default we should look for the FilterTest-context.xml
on the classpath to configure the test case which looks like this
...
:
...
Spring Test with Java Config Example
Here is the Spring TestTesting example using Java Config.
...
For more information see Spring Java Config.
...
...
This is similar to the XML Config example above except that there is no XML file and instead the nested ContextConfig
class does all of the configuration; so your entire test case is contained in a single Java class. We currently have to reference by class name this class in the @ContextConfiguration
which is a bit ugly. Please vote for SJC-238 to address this and make Spring Test work more cleanly with Spring JavaConfig.
Its totally optional but for the ContextConfig
implementation we derive from SingleRouteCamelConfiguration
which is a helper Spring Java Config class which will configure the CamelContext
for us and then register the RouteBuilder
we create.
Since Camel 2.11.0 you can use the CamelSpringJUnit4ClassRunner
with CamelSpringDelegatingTestContextLoader
like example using Java Config with CamelSpringJUnit4ClassRunner
:
Spring Test with XML Config and Declarative Configuration Example
Here is a Camel test support enhanced Spring Testing example using XML Config and pure Spring Test based configuration of the Camel Context:@RunWith
annotation to support the features of CamelTestSupport
through annotations on the test class. See Spring Testing for a list of annotations you can use in your tests.
Blueprint Test
...
Here is the Blueprint Testing example using XML Config:getBlueprintDescriptors
to indicate that by default we should look for the camelContext.xml
in the package to configure the test case which looks like this:
Testing Endpoints
Camel provides a number of endpoints which can make testing easier.
...
Name | Description |
---|---|
Direct invocation of the consumer from the producer so that single threaded (non-SEDA) in VM invocation is performed which can be useful to mock out physical transports | |
Delivers messages asynchonously asynchronously to consumers via a java.util.concurrent.BlockingQueue which is good for testing asynchronous transports | |
Works like SEDA but does not validate the endpoint URI, which makes stubbing much easier. |
Testing existing routes
Camel provides some features to aid during testing of existing routes where you cannot or will not use Mock etc. For example you may have a production ready route which you want to test with some 3rd party API which sends messages into this route.
Name | Description |
---|---|
Allows you to be notified when a certain condition has occurred. For example when the route has completed five messages. You can build complex expressions to match your criteria when to be notified. | |
Allows you to advice or enhance an existing route using a RouteBuilder style. For example you can add interceptors to intercept sending outgoing messages to assert those messages are as expected. |