2014-12-19 4 views
2

Я пишу тестовые примеры для библиотеки, которая скрывает бизнес верблюда от конечных пользователей. Библиотека предоставляет методы, такие как sendMessages() и т. Д. И внутренне с помощью ProducerTemplate отправляет сообщения на маршрут верблюда, где они агрегируются и отправляются в пункт назначения.Как высмеять конечные точки верблюда в отдельном контексте верблюда

Я хочу, чтобы иметь возможность писать тесты, которые вызывают метод библиотеки, и издеваться над конечными точками верблюда, чтобы впоследствии это подтвердить.

Если я использую CamelSpringTestSupport, он в основном создает новый ClassPathXmlApplicationContext, используя который я могу проверить маршруты.

Однако я хочу проверить конечные точки, которые создаются в контексте верблюда библиотеки, и что я тестирую также и библиотечный код.

Можно ли это сделать?

ответ

2

использования Верблюжьего AdviceWith динамически изменять поведение маршрута (перехват обмен и отправить фиктивные конечные точки для проверки, и т.д.) ... его очень гибкий и использует знакомые MockEndpoints и т.д ...

, например .. .то перехватывать сообщения, отправленные на direct:start маршрут

context.getRouteDefinition("myRouteId").adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     interceptSendToEndpoint("direct:start") 
       .skipSendToOriginalEndpoint() 
       .to("mock:start"); 
    } 
}); 

getMockEndpoint("mock:start").expectedBodiesReceived("Hello World"); 
0

Мой последний тест выглядит следующим образом, где маршруты в существующий контекст получить издевались.

import org.apache.camel.Exchange; 
import org.apache.camel.builder.AdviceWithRouteBuilder; 
import org.apache.camel.component.mock.MockEndpoint; 
import org.apache.camel.test.spring.CamelSpringTestSupport; 
import org.junit.Assert; 
import org.junit.BeforeClass; 
import org.junit.Test; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.test.annotation.DirtiesContext; 
import java.net.URL; 
import java.nio.file.Paths; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class MyAppTest extends CamelSpringTestSupport { 

private static MyApp myapp; 
protected final Logger log = LoggerFactory.getLogger(MyAppTest.class); 

@Override 
protected AbstractApplicationContext createApplicationContext() { 
    return (AbstractApplicationContext) myApp.getContext(); 
} 

@Override 
public boolean isUseAdviceWith() { 
    // tell we are using advice with, which allows us to advice the route 
    // before Camel is being started, and thus can replace myApp Endpoint with something else. 
    return true; 
} 

@BeforeClass 
public static void oneTimeSetUp() throws Exception { 
    myApp = new myApp(); 
} 

@Test 
@DirtiesContext 
public void test01() throws Exception { 

    log.info("TEST: Going to apply advideWith clause to existing route"); 

    context.getRouteDefinition("bulkIndexRoute").adviceWith(context, new AdviceWithRouteBuilder() { 
     @Override 
     public void configure() throws Exception { 

      weaveByToString(".*myAppEndpoint.*") 
        .replace() 
        .aggregate(header("ABC"), new ArrayListAggregationStrategy()) 
        .completionSize(100) 
        .completionInterval(1000) 
        .to("mock:foo"); 
     } 
    }); 
    log.info("TEST: Done applying adviceWith Clause"); 

    MockEndpoint mockedES = getMockEndpoint("mock:foo"); 
    mockedES.expectedMessageCount(2); 
    mockedES.setAssertPeriod(10000); 

    // Create 150 test documents and index them 
    for(int i = 0; i < 150; i++) { 
     Map<String, String> d = new HashMap<String, String>(); 
     d.put("key1", "value" + i); 
     d.put("key2", "value" + i); 
     myApp.send("param1", "param2", d); 
    } 

    mockedES.assertIsSatisfied(); 

    int count = 0; 
    for(Exchange ex : mockedES.getExchanges()){ 
     List<Map<String, Object>> documentList = ex.getIn().getBody(List.class); 
     count += documentList.size(); 
    } 

    Assert.assertEquals("Received back 150 message", 150, count); 
} 

}

MyApp класс возвращает контекст для теста, так что маршруты в бегущего контексте может быть издевались.

Смежные вопросы