Тестирование верблюдов - Как протестировать процессор из FileConsumer/FTPConsumer?
У меня есть верблюжий маршрут, который опрашивает файлы с ftp-сервера и отправляет файлы на s3. У меня есть несколько процессоров в маршруте, который вычисляет / манипулирует заголовками на основе имени файла. Мне нужно проверить этот маршрут. Как я могу внедрить свой процессор и использовать язык файлов внутри моего процессора?
@RunWith(MockitoJUnitRunner.class)
public class CamelS3HeadersProcessorTest extends CamelTestSupport {
private String filePath = "src/test/resources/sample.txt";
// @Autowired
// private CamelS3HeadersProcessor camelS3HeadersProcessor;
@Test
public void shouldSetS3HeadersProperly() throws Exception {
File file = new File(filePath);
template.sendBody("direct:start", file);
getMockEndpoint("mock:result").expectedMessageCount(1);
getMockEndpoint("mock:result").expectedHeaderReceived(S3Constants.KEY, file.getName());
assertMockEndpointsSatisfied();
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").process(new CamelS3HeadersProcessor()).to("mock:result");
}
};
}
}
Процессор:
@Component
public class CamelS3HeadersProcessor implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
SimpleBuilder simpleBuilder = new SimpleBuilder("${file:name}");
String fileName = simpleBuilder.evaluate(exchange, String.class);
//do some logic and set headers
}
}
Я не хочу издеваться над моим процессором. Я хочу издеваться над своими конечными точками и тестировать мой процессор.
Проблемы:
Не удается автоматически подключить / ввести мой процессор.
Имя файла было оценено как ноль. Как использовать FileConsumer/FTPConsumer вместо ProducerTemplate?
2 ответа
Я думаю, что в createRouteBuilder у вас будет только CamelContext, а не ApplicationContext. Вы можете построить маршрут в тесте или в методе @Before.
У меня это сработало так:
@SpringBootTest
@EnableAutoConfiguration
@RunWith(CamelSpringRunner.class)
public class MyProcessorTest extends AbstractJUnit4SpringContextTests {
@Autowired
private CamelContext camelContext;
@Autowired
private MyProcessor myProcessor;
@EndpointInject(uri = "mock:result")
private MockEndpoint resultEndpoint;
@Produce(uri = "direct:start")
private ProducerTemplate template;
@Before
public void setUp() throws Exception {
camelContext.addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start").process(myProcessor).to("mock:result");
}
});
camelContext.start();
}
@DirtiesContext
@Test
public void test1() throws Exception {
resultEndpoint.expectedMessageCount(1);
String myProcessorInput = "test"; // or Object
template.sendBody(myProcessorInput);
resultEndpoint.assertIsSatisfied();
// or other result Type
String body = (String)resultEndpoint.getExchanges().get(0).getIn().getBody(String.class);
assertNotNull(body);
// tests
}
@DirtiesContext
@Test
public void test2() throws Exception {
}
}
В рабочем коде ваш RouteBuilder будет создан за пределами теста, поэтому он может внедрить выбранного вами производителя, например
@Component
class MyRouteBuilder extends RouteBuilder {
private Processor processor;
@Autowired
public MyRouteBuilder(Processor pProcessor) {
processor = pProcessor;
}
@Override
public void configure() {
from("direct:start").process(processor);
}
}
Затем в своем тесте вы можете указать, какой процессор (по ошибке или нет) вам нужен:
public class MyTest extends CamelTestSupport {
private Processor processor;
@Override
protected RoutesBuilder createRouteBuilder() {
return new MyRouteBuilder(processor);
}
}
(Обратите внимание, что я удалил фиктивную конечную точку из маршрута: см. Эту проблему. Как проверить верблюжий маршрут без изменения производственного кода? Как выполнить тестирование без него.)