2013-10-01 52 views
1

很簡單路線:駱駝模擬端點沒有收到任何消息

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> 

駱駝嘗試:2.12。 1,駱駝:2.11.1 今天打破了我的頭試圖解決。完整的測試grails項目只包含這個問題在這裏:https://github.com/gutsal-arsen/mocktest

任何人都可以請幫我解決?

UPDATE 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

爲了解決這個問題,我們應該重寫CamelTestSupport#createCamelContext方法,因爲默認實現創建單獨的駱駝方面,它確實不包含我們的路線(因此,模擬端點是假的)。

像這樣:

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

mockEndpoint.assertIsSatisfied()搞亂了我的測試用例,assertMockEndpointsSatisfied()修復了它。謝謝。 –

0

你從未定義發送消息到mock:bar終點的路線......添加像這樣

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

請閱讀我頂消息。我已經使用了這條路線。 – Archer

+0

根據您發佈的代碼和github上的代碼(test/integration/mocktest/TestRouteTests.groovy)...它沒有定義該路由,因此我的迴應 –

+0

路由是在'grails-app/routes'內定義的。它使用':routing:1.2.8'插件 – Archer