Hi Owain

Thanks for your answer. The Problem was in fact the TestRunner. I used 
"CamelSpringJUnit4ClassRunner" in my example project. If I simply change this 
to "CamelSpringBootJUnit4ClassRunner" (notice the "Boot" in it), the test in my 
example project works fine. 

@MockEndpoints and @EndpointInject are working like a charm, no need to advice 
the routes to just get Mocks for your endpoints.

Regards
Stephan
 


-----Ursprüngliche Nachricht-----
Von: Owain McGuire [mailto:owain@integration.technology] 
Gesendet: Mittwoch, 7. Juni 2017 13:45
An: users@camel.apache.org
Betreff: Re: Mocks receive no messages in Camel-SpringBoot test

Stephan,

You appear not to be mocking the activemq:queue:output endpoint before you get 
the mock endpoint i the test.  If you temporarily change the route uri to 
mock:activemq:queue:output then the test works.  I am not sure how you would do 
it using injection.  I use advicewith on the route to mock URIs before the 
test.  Here is a previous response 
https://stackoverflow.com/questions/29581561/in-an-apache-camel-application-how-can-unit-tests-inject-mock-endpoints-in-plac
 
<https://stackoverflow.com/questions/29581561/in-an-apache-camel-application-how-can-unit-tests-inject-mock-endpoints-in-plac>
 to the same issue.

Here is another code snippet

@RunWith(CamelSpringBootRunner.class)
@MockEndpoints
@UseAdviceWith
@SpringBootTest(classes = MyApplication.class, webEnvironment = 
SpringBootTest.WebEnvironment.RANDOM_PORT)

public class AssignOrderReferenceTests {


  public static final String ROUTE_ID = “myroute";
  public static final String MOCK_ENRICH = "mock:put";
  public static final String MOCK_OUT = "mock:out";
  
  @Autowired
  private ProducerTemplate template;

  @Autowired
  private CamelContext camelContext;

  @Test
  public void formatReferenceFromCounter() throws Exception {


    camelContext.getRouteDefinition(ROUTE_ID).adviceWith(camelContext, new 
AdviceWithRouteBuilder() {
      @Override
      public void configure() throws Exception {
        replaceFromWith("direct:in");
        weaveById(“id-of-endpoint").replace().inOut(MOCK_ENRICH);  // you can 
use enpoint patterns.  Have a look at the adviceWith docs. 
        weaveAddLast().to(MOCK_OUT);
      }
    });

    MockEndpoint mockEnrich = camelContext.getEndpoint(MOCK_ENRICH, 
MockEndpoint.class);
    MockEndpoint mockOut = camelContext.getEndpoint(MOCK_OUT, 
MockEndpoint.class);
      mockEnrich.whenAnyExchangeReceived(new Processor() {
      @Override
      public void process(Exchange exchange) throws Exception {
        exchange.getOut().setBody(COUNTER);
      }
    });

    mockEnrich.expectedMessageCount(1);
    mockOut.expectedMessageCount(1);

    mockOut.expectedBodyReceived().constant(Prefix + (COUNTER));

    camelContext.start();

    template.sendBody("direct:in", 1);

    mockOut.assertIsSatisfied();


The AdviceWith is very powerful. 

HTH.

O.
> On 7 Jun 2017, at 11:27, Burkard Stephan <stephan.burk...@visana.ch> wrote:
> 
> Hi 
> 
> I built Camel route tests in a Spring Boot project. My injected mock 
> endpoints do not receive any messages. I also tried to get the mock through 
> Camel context, but also without success.
> 
> The log output says that the mock endpoints are created and the mocked 
> endpoint receives messages. Have I missed something or is this a known 
> problem? If the latter, how can I bring my mocks to work?
> 
> I have attached a very simple Maven test project to show the problem. 
> 
> SpringBoot 1.4.2.RELEASE
> Camel 2.17.3
> 
> Thanks 
> Stephan
> <camelbootmocks.zip>

Reply via email to