Я использую camel.version 2.18.1 и spring-boot 1.5.1.RELEASE.
У меня есть несколько более или менее сложных маршрутов Camel, где сообщения из тем MQ будут использоваться, фильтроваться, преобразовываться и, наконец, маршрутизироваться вразные MQ темы.
from("{{sourceEP}}").to("{{archiveEP}}")
.process(new MyProcessor())
.to("{{archiveEP}}").to("{{resultEP}}");
application.properties
sourceEP=jms:topic:SOURCE
archiveEP=jms:topic:ARCHIVE
resultEP=jms:topic:TARGET
Для каждого маршрута существует более 40 различных сценариев.Поэтому у меня есть около 50 JUnit-тестов для каждого маршрута, в общей сложности у меня есть около 400 JUnit-тестов, которые я запускаю с подключаемым модулем maven-surefire для выполнения параллельного тестирования.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<parallel>classes</parallel>
<threadCount>4</threadCount>
</configuration>
</plugin>
Проблема заключается в том, когдаJUnit-тесты выполняются параллельно, это приведет к несогласованности в конечных точках производителя ( EDIT: для тестирования Я использую конечные точки Mock от Camel).Параллельные тесты повлияли на другие тесты, и ожидаемое количество сообщений в целевых конечных точках неверно.
Тест: application.properties
sourceEP=direct:start
archiveEP=mock:archive
resultEP=mock:result
RouteTest.java
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = MyApplication.class)
public class RouteTest {
@Autowired
private CamelContext context;
@EndpointInject(uri = "{{archiveEP}}")
protected MockEndpoint archiveEndpoint;
@EndpointInject(uri = "{{resultEP}}")
protected MockEndpoint resultEndpoint;
@Produce(uri = "{{sourceEP}}")
protected ProducerTemplate sourceEndpoint;
@Before
public void setup() {
sourceEndpoint.cleanUp();
archiveEndpoint.reset();
resultEndpoint.reset();
}
@Test
public void test1() throws Exception {
sourceEndpoint.sendBody("some text");
archiveEndpoint.expectedMessageCount(2);
archiveEndpoint.assertIsSatisfied();
resultEndpoint.expectedMessageCount(1);
resultEndpoint.assertIsSatisfied();
resultEndpoint.expectedBodiesReceived("expected output");
}
@Test
public void test2() throws Exception {
sourceEndpoint.sendBody("another text");
archiveEndpoint.expectedMessageCount(2);
archiveEndpoint.assertIsSatisfied();
resultEndpoint.expectedMessageCount(1);
resultEndpoint.assertIsSatisfied();
resultEndpoint.expectedBodiesReceived("another output");
}
...
}
Мой вопрос, возможно ли вообще запускать JUnit-тесты верблюжьих маршрутов параллельно?
Я попытался добавить @DirtiesContext
в методы испытаний, чтобы заставить Spring Testing автоматически перезагружать CamelContext после каждого метода тестирования: http://camel.apache.org/testing.html
Что, конечно, не работает при выполнении параллельного теста, потому чторезультат по-прежнему случайный, а ожидаемое количество сообщений неверно.
В итоге я установил эти тесты, которые будут проверять маршруты Camel на @NotThreadSafe
, чтобы обеспечить выполнение одного потока.Только эти JUnit-тесты, которые будут тестировать другие функциональные возможности, кроме маршрутизации Camel, выполняются параллельно.
Но это неудовлетворительное решение в отношении количества почти 400 JUnit-тестов.
Не существуетконфигурация или настройка для параллельного тестирования верблюжьих маршрутов?