Mock Component
Testing of distributed and asynchronous processing is notoriously difficult. The Mock Component provides a great tool for creating good integration test cases based on the Enterprise Integration Patterns using the various Components in Camel.
The Mock component provides a powerful declarative testing mechanism which is similar to jMock in that it allows declarative expectations to be created on any Camel Endpoint before a test begins. Then the test is ran which typically fires messages to one or more endpoints and finally the expectations can be asserted in a test case to ensure the system worked as expected.
This allows you to test various things like
- the correct number of messages are received on each endpoint
- that the correct payloads are received, in the right order
- that messages arrive on an endpoint in order, using some Expression to create an order testing function
- that messages arrive match some kind of Predicate such as that specific headers have certain values, or that parts of the messages match some predicate such as by evaluating an XPath or XQuery Expression
URI format
mock:someName
Where someName can be any string to uniquely identify the endpoint
Examples
Here's a simple example of MockEndpoint in use. First the endpoint is resolved on the context. Then we set an expectation, then after the test has run we assert our expectations are met.
MockEndpoint resultEndpoint = context.resolveEndpoint("mock:foo", MockEndpoint.class); resultEndpoint.expectedMessageCount(2); // send some messages ... // now lets assert that the mock:foo endpoint received 2 messages resultEndpoint.assertIsSatisfied();
You typically always call the assertIsSatisfied() method to test that the expectations were met after running a test.
Setting expectations
You can see from the javadoc of MockEndpoint the various helper methods you can use to set expectations. The mail methods available are as follows
Method |
Description |
---|---|
to define the expected message count on the endpoint |
|
to define the minimum number of expected messages on the endpoint |
|
to define the expected bodies that should be received (in order) |
|
to add an expectation that messages are received in order using the given Expression to compare messages |
|
to add an expectation that messages are received in order using the given Expression to compare messages |
|
to add an expectation that no duplicate messages are received; using an Expression to calculate a unique identifier for each message. This could be something like the JMSMessageID if using JMS, or some unique reference number within the message. |
Here's another example
resultEndpoint.expectedBodiesReceived("firstMessageBody", "secondMessageBody", "thirdMessageBody");
Adding expectations to specific messages
In addition you can use the message(int messageIndex) method to add assertions about a specific message that is received.
For example to add expectations of the headers or body of the first message (using zero based indexing like java.util.List), you can use this code
resultEndpoint.message(0).header("foo").isEqualTo("bar");
There are some examples of the Mock endpoint in use in the camel-core processor tests.