Camel模拟端点未收到任何消息

4
非常简单的路由:
import org.apache.camel.builder.RouteBuilder

class TestRoutes extends RouteBuilder {    
  @Override
  void configure(){
    from("direct:foo").to("mock:bar")
  }
}

非常简单的测试用例:
package mocktest

import static org.junit.Assert.*
import org.junit.*

import org.apache.camel.CamelContext
import org.apache.camel.ProducerTemplate
import org.apache.camel.test.junit4.CamelTestSupport

class TestRouteTests extends CamelTestSupport {

  def CamelContext camelContext
  def ProducerTemplate producerTemplate

  @Test
  void testSomething() {

    getMockEndpoint('mock:bar').expectedMessageCount(1)
    producerTemplate.sendBody('direct:foo', "Hello World")

    assertMockEndpointsSatisfied()
  }
}

得到这个:
| Failure:  testSomething(mocktest.TestRouteTests)
|  java.lang.AssertionError: mock://bar Received message count. Expected: <1> but was: <0>

尝试过camel:2.12.1和camel:2.11.1,今天一直在努力解决问题。包含此问题的完整测试grails项目在此处:https://github.com/gutsal-arsen/mocktest。请问有谁可以帮我解决吗? 更新1
  @Test
  void testSimpleRoute() {
    def mockEndpoint
    mockEndpoint = camelContext.getEndpoint('mock:bar')
    //mockEndpoint = getMockEndpoint('mock:bar')                                                                                                                                                                                               

    mockEndpoint.expectedMessageCount(1)

    producerTemplate.sendBody('direct:foo', 'Hello World')

    mockEndpoint.assertIsSatisfied()
  }

这个没有:
   @Test
  void testSimpleRoute() {
    def mockEndpoint
    //mockEndpoint = camelContext.getEndpoint('mock:bar')
    mockEndpoint = getMockEndpoint('mock:bar')                                                                                                                                                                                               

    mockEndpoint.expectedMessageCount(1)

    producerTemplate.sendBody('direct:foo', 'Hello World')

    mockEndpoint.assertIsSatisfied()
}

所以问题在于 getMockEndpoint() 方法内部。
2个回答

2
为了解决这个问题,我们应该覆盖CamelTestSupport#createCamelContext方法,因为默认实现会创建单独的camel上下文,其中不包含我们的路由(因此,模拟的端点是虚假的)。
就像这样:
   protected CamelContext createCamelContext() throws Exception {                                                                                                                         
    return camelContext;
  }

完整的源代码现在看起来像这样:
package mocktest

import static org.junit.Assert.*
import org.junit.*

import org.apache.camel.CamelContext
import org.apache.camel.impl.DefaultCamelContext
import org.apache.camel.ProducerTemplate
import org.apache.camel.test.junit4.CamelTestSupport
import org.apache.camel.builder.RouteBuilder

import org.apache.camel.processor.interceptor.Tracer
import org.apache.camel.processor.interceptor.DefaultTraceFormatter
import org.apache.camel.LoggingLevel

class TestRouteTests extends CamelTestSupport {

  def CamelContext camelContext
  def ProducerTemplate producerTemplate

  protected CamelContext createCamelContext() throws Exception {                                                                                                                         
    return camelContext;
  }

  @Test
  void testSomething() {
    def mockEndpoint
    //mockEndpoint = camelContext.getEndpoint('mock:bar') // this works                                                                                                                  
    mockEndpoint = getMockEndpoint('mock:bar') // this works now also                                                                                                                          

    mockEndpoint.expectedMessageCount(1)
    producerTemplate.sendBody('direct:foo', "Hello World")

    assertMockEndpointsSatisfied()                                                                                             
  }
}

mockEndpoint.assertIsSatisfied() 函数破坏了我的测试用例,assertMockEndpointsSatisfied() 修复了它。谢谢。 - Rahul Dabas
你的camelContext实例化了吗?我在Java中尝试过,但camelContext仍然为null。 - рüффп
你认为在createCamelContext方法中可以返回new DefaultCamelContext()吗? - Archer

0

您从未定义发送消息到mock:bar端点的路由...请添加类似以下内容的路由

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from("direct:foo").to("mock:bar");
        }
    };
}

根据您发布的代码和Github上的代码(test/integration/mocktest/TestRouteTests.groovy)...它没有定义该路由,因此我的响应是如此。 - Ben ODay
路由定义在 grails-app/routes 中。它使用 :routing:1.2.8 插件。 - Archer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接