Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Wiki Markup
h2. Camel Test

As a simple alternative to using [Spring Testing] or [Guice] the *camel-test* module was introduced into the Camel 2.0 trunk so you can perform powerful [Testing] of your [Enterprise Integration Patterns] easily.

{info:tile=JUnit or TestNG}
The {{camel-test}} JAR is using JUnit. There is an alternative {{camel-testng}} JAR (Camel 2.8 onwards) using the [TestNG|http://testng.org/doc/index.html] test framework.
{info}

h3. Adding to your pom.xml

To get started using Camel Test you will need to add an entry to your pom.xml

h4. JUnit
{code:xml}
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-test</artifactId>
  <version>${camel-version}</version>
  <scope>test</scope>
</dependency>
{code}

h4. TestNG
*Available as of Camel 2.8*
{code:xml}
<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-testng</artifactId>
  <version>${camel-version}</version>
  <scope>test</scope>
</dependency>
{code}

You might also want to add slf4j and log4j to ensure nice logging messages (and maybe adding a [log4j.properties|http://svn.apache.org/repos/asf/camel/trunk/components/camel-test/src/test/resources/log4j.properties] file into your src/test/resources directory).

{code:xml}
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <scope>test</scope>
</dependency>
{code}

h3. Writing your test

You firstly need to derive from the class *CamelTestSupport* and typically you will need to override the *createRouteBuilder()* method to create routes to be tested.

Here is an [example|http://svn.apache.org/repos/asf/camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java]. 

{snippet:lang=java|id=example|url=camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/FilterTest.java}

Notice how you can use the various [Camel binding and injection annotations|Bean Integration] to inject individual [Endpoint] objects - particularly the [Mock endpoints|Mock] which are very useful for [Testing]. Also you can inject [producer objects such as ProducerTemplate or some application code interface|POJO Producing] for sending messages or invoking services.


h3. JNDI

Camel uses a [Registry] to allow you to configure [Component] or [Endpoint] instances or [Beans used in your routes|Bean Integration]. If you are not using [Spring] or [OSGi] then [JNDI] is used as the default registry implementation.

So you will also need to create a *jndi.properties* file in your *src/test/resources* directory so that there is a default registry available to initialise the [CamelContext].

Here is [an example jndi.properties file|http://svn.apache.org/repos/asf/camel/trunk/components/camel-test/src/test/resources/jndi.properties]

{code}
java.naming.factory.initial = org.apache.camel.util.jndi.CamelInitialContextFactory
{code}

h3. Dynamically assigning ports
*Available as of Camel 2.7*

Tests that use port numbers will fail if that port is already on use. {{AvailablePortFinder}} provides methods for finding unused port numbers at runtime. 
{code}

// Get the next available port number starting from the default starting port of 1024
int port1 = AvailablePortFinder.getNextAvailable();
/* 
 * Get another port. Note that just getting a port number does not reserve it so
 * we look starting one past the last port number we got.
 */
int port2 = AvailablePortFinder.getNextAvailable(port1 + 1);

{code}

{show-to:user=tjs}
{snippet:id=e1|lang=java|url=camel/trunk/components/camel-mina/src/main/java/org/apache/camel/component/mina/MinaConsumerTest.java}
{show-to}

h3. See Also

* [Testing]
* [Mock]