Hi Okay I was building a little test in camel-core to reproduce this, and its because of the Camel 2.20 optimisations we have done around type converters.
So when the data is converted to a String then we hit this optimised IO converter https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/converter/IOConverterOptimised.java#L49 That ensures the stream cache is reset before any type conversion attempt, which then ensures we can re-read the payload from the unmarshal operation of jackson. On Wed, Nov 15, 2017 at 10:05 AM, Claus Ibsen <claus.ib...@gmail.com> wrote: > Hi > > I guess its a bit expected as the output from jackson is streaming > based and even so when stream caching is enabled - then when you > convert the payload the 2nd time in the expectation then the payload > has not been reset prior and therefore is eol, and the assertion > fails. > > Camel will automatic reset stream caching (when possible) during > routing, so if you had 2 mock endpoints mock:a and mock:b, and each > had one assertion like yours, then it would work. > > However as Gregor writes it seems we have improved something somewhere > in 2.20 > 2.19 that mitigates this problem. It could be in > camel-jackson or Camel data formats, or in some stream caching type > converter, etc. I haven't looked deeper or tried to run this test / > debug it etc. > > You can just add a .convertBodyTo(String.class) before your mock > endpoint and your test on 2.19.x would work. > > An alternative is to consider making mock endpoint reset the stream > caching for each expectation it evaluations (which would be like some > kind of root fix). > > On Fri, Nov 10, 2017 at 7:12 PM, Minhtri Tran <mtran7...@gmail.com> wrote: >> Hello, >> >> I am currently having an issue with setting up multiple expectations >> in a test case when streamCaching is enabled and json marshalling is >> used. Every expectation except the first one fails. >> >> Here’s my test class: >> >> @RunWith(CamelSpringBootRunner.class) >> >> @SpringBootTest(classes = MyApplication.class) >> >> public class MyTest extends CamelTestSupport { >> >> >> >> @Test >> >> public void test() throws Exception { >> >> class Hello { >> >> Hello(String value) { >> >> this.value = value; >> >> } >> >> >> >> private String value; >> >> >> >> public String getValue() { >> >> return value; >> >> } >> >> >> >> public void setValue(String value) { >> >> this.value = value; >> >> } >> >> } >> >> >> >> MockEndpoint mock = getMockEndpoint("mock:dest"); >> >> mock.message(0).body().convertToString().contains("hello"); >> >> mock.message(0).body().convertToString().contains("world"); >> >> template.sendBody("direct:source", new Hello("hello world")); >> >> mock.assertIsSatisfied(); } >> >> >> >> @Override >> >> protected RoutesBuilder createRouteBuilder() throws Exception { >> >> return new RouteBuilder() { >> >> @Override >> >> public void configure() throws Exception { >> >> from("direct:source") >> >> .streamCaching() >> >> .marshal().json(JsonLibrary.Jackson) >> >> .to("mock:dest"); >> >> } >> >> }; >> >> } >> >> } >> >> >> >> This is the assertion error that I’m getting: >> >> java.lang.AssertionError: Assertion error at index 0 on mock >> mock://dest with predicate: Simple: body contains world evaluated as: >> contains world on Exchange[ID-A1504214-60132-1508506055845-1-2] >> >> >> >> Why is this happening? How can I set multiple expectations on the >> same message body in this case? >> >> >> >> Thanks, >> >> Minhtri > > > > -- > Claus Ibsen > ----------------- > http://davsclaus.com @davsclaus > Camel in Action 2: https://www.manning.com/ibsen2 -- Claus Ibsen ----------------- http://davsclaus.com @davsclaus Camel in Action 2: https://www.manning.com/ibsen2