Grails 骆驼模拟端点未接收任何消息

Grails 骆驼模拟端点未接收任何消息,grails,apache-camel,Grails,Apache Camel,非常简单的路线: 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.j

非常简单的路线:

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>
这一条没有:

   @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()方法内部

您从未定义将消息发送到
mock:bar
端点的路由…添加如下内容

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

为了解决这个问题,我们应该重写
CamelTestSupport#createCamelContext
方法,因为默认实现创建单独的camelcontext,它不包含我们的路由(因此,模拟端点是假的)

像这样:

   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()                                                                                             
  }
}

根据您发布的代码和github上的代码(test/integration/mocktest/TestRouteTests.groovy)…它没有定义该路由,因此我的responseroute是在
grails app/routes
中定义的。它使用了
:路由:1.2.8
插件MockEndpoint.AssertsAstified()弄乱了我的测试用例,AssertMockEndpointsAstified()修复了它。谢谢。你的名字是什么?我在Java中尝试了这一点,但camelContext仍然为空。您可以在
createCamelContext
方法中
返回新的DefaultCamelContext()
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()                                                                                             
  }
}