I had the time to build a little test case and so I'll answer (a bit sadly)
my own questions.
*1 & 2: *Nothing is ordered. It just wait until everything is done. We can
call that an unordered mock
*3: *Yes. Every "expect" are about all messages. So if you have two
messages, you will need to expectCount(3) and expected 2 headers. It's like
having a bunch of asserts.
*4:* If it called afterwards. In the assertMockEndpointsSatisfied
*5: *My fault. I should have read more carefully the advicewith
page. weaveAddAfter is perfect.
------------------------------------------------------------------------------------------------------
public class HenriRouteBuilderTest extends CamelTestSupport {
@Override
public String isMockEndpoints() {
return "*";
}
@Test
public void testToconfigure() throws Exception {
getMockEndpoint("mock:result").expectedMessageCount(2);
getMockEndpoint("mock:direct:start1").expectedMessageCount(1);
getMockEndpoint("mock:direct:start2").expectedMessageCount(1);
getMockEndpoint("mock:result").expectedBodiesReceived("Henri1",
"Henri2"); // can't specify only one body
final AtomicBoolean b = new AtomicBoolean();
getMockEndpoint("mock:direct:start2").message(0).body(Message.class).in(new
Predicate() {
@Override
public boolean matches(Exchange exchange) {
b.set(true);
return exchange.getIn().getBody().equals("Henri2");
}
});
template.sendBody("direct:start1", "Henri1");
template.sendBody("direct:start2", "Henri2");
assertFalse(b.get());
assertMockEndpointsSatisfied();
assertTrue(b.get());
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() {
from("direct:start1").to("mock:result");
from("direct:start2").to("mock:result");
}
};
}
}
On 5 November 2012 14:06, Henri Tremblay <[email protected]> wrote:
> I've already read these two links and managed to do nice unit tests for
> simple routes. But I still don't have answers to my questions. I'll check
> the webinar. Meanwhile, I'll try to ask simpler questions.
>
> I'm working with
> @Override
> public String isMockEndpoints() {
> return "*";
> }
> and a test always ends with assertMockEndpointsSatisfied();
>
> *1-*
> MockEndpoint jdbc = getMockEndpoint(...)
> MockEndpoint seda = getMockEndpoint(...)
> jdbc.expectedMessageCount(1);
> seda.expectedMessageCount(1);
>
> My understanding is that assertMockEndpointsSatisfied will wait for the
> jdbc and then the seda message one after the other. Am I right?
>
> *2-*
> MockEndpoint jdbc = getMockEndpoint(...)
> MockEndpoint seda = getMockEndpoint(...)
> jdbc.expectedMessageCount(1);
> seda.expectedMessageCount(1);
> jdbc.expectedMessageCount(1);
>
> Same here, waiting for jdbc, then seda, then jdbc. If that right?
>
> *3-*
> MockEndpoint jdbc = getMockEndpoint(...)
> jdbc..expectedMessageCount(1);
> jdbc..expectedHeaderReceived("header", "value");
>
> Only one message will be received and its header will be checked.
>
> *4-*
> MockEndpoint jdbc = getMockEndpoint(...)
> jdbc.expectedMessageCount(1);
> jdbc.message(0).body(Message.class).in(new Predicate() {
> public boolean matches(Exchange exchange) {
> Message m = exchange.getIn().getBody(Message.class);
> return m.getStatus().equals(Message.STATUS_IP);
> }
> }
>
> I'm not sure the implementation of the Predicate is the best way to do it
> but then, about the ordering, my understanding is that the message(0) will
> check the first message by this mock. However, I don't know if it's called
> a soon as there's one message available.
>
> *5-*
> Getting the message from the database before it is modified. I probably
> can do that with an advice. However, advices seem to be before the actual
> endpoint is called. Is there a way to act after?
>
> Thanks
> -
> Henri
>
> On 5 November 2012 11:29, Claus Ibsen <[email protected]> wrote:
>
>> On Sun, Nov 4, 2012 at 10:09 AM, Henri Tremblay
>> <[email protected]> wrote:
>> > Hi,
>> >
>> > I've started to play with Camel and loving it. However, I'm still having
>> > problems with the testing.
>> >
>> > I want to do an integration test of a complete message processing.
>> Here's
>> > the flow, please focus on the solution, not on the fact that the
>> > architecture is a nonsense, that part isn't really my fault (but I can
>> use
>> > any useful ideas)
>> >
>> > Here it goes:
>> >
>> > 1. Message received from JMS
>> > 2. Stored in DB
>> > 3. Read from DB with a consumer
>> > 4. Sent to a direct route
>> > 5. Status changed
>> > 6. Sent to another system in REST
>> > 7. The other system will change the status in DB and create new DB
>> > entries
>> > 8. Read from DB with another consumer the new DB entries
>> > 9. Sent to the same direct route
>> > 10. Sent them to the same system in REST
>> >
>> > My questions are
>> >
>> > - I want to check the message when entering in both direct route. How
>> > calls like expectedMessageCount are working? Is it ordered? So I
>> should put
>> > an expectedMessageCount(1) for the first call and another for the
>> second a
>> > bit below in my test
>>
>> expected message count just checks that X number of messages was
>> received on the mock.
>> You can read the javadoc of the methods to learn more about them.
>>
>> If you use the same mock in both routes, then you can set expectation
>> that a message with content A is received
>> before message with content B etc.
>>
>> I suggest to dig in the links from Christian and if you got the time
>> then David V. did a webinar recently about unit testing with Camel.
>> Its called "Are you Camel routes ready for production".
>> http://fusesource.com/resources/video-archived-webinars/
>>
>>
>>
>> > - I want to be able to check the status changed at point 5 before it
>> is
>> > changed again at step 7. How can I do that?
>> > - What's the ordering of things like
>> > expectedMessageCount, expectedBodyReceived? When they are specified
>> in a
>> > row, they always apply to the same message? Is message(0) working
>> the same
>> > way?
>> >
>>
>> Check the javaddoc, for example expectedBodyReceived expects X
>> messages received in the order,
>> having the body value you specify, eg
>>
>> expectedBodyReceived("foo", "bar");
>>
>> would expect 2 messages, and the 1st has "foo" in message body, the
>> 2nd has "bar" in message body etc.
>>
>>
>> > If it can help understanding the questions, I'm an EasyMock dude. So I'm
>> > trying to map the Camel expectation to their equivalent EasyMock
>> behavior.
>> >
>> > Any help?
>> >
>> > Thanks,
>> > Henri
>>
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> Red Hat, Inc.
>> FuseSource is now part of Red Hat
>> Email: [email protected]
>> Web: http://fusesource.com
>> Twitter: davsclaus
>> Blog: http://davsclaus.com
>> Author of Camel in Action: http://www.manning.com/ibsen
>>
>
>