295.4. 单元测试 Camel 路由
Service 组件是一个 POJO,对(非OSGi)单元测试没有特殊要求。然而,有一些特定于 Camel SCR 的技术,或者只是简化测试。
以下是一个单元测试示例,由 camel-archetype-scr 生成:
// This file was generated from org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example;
import java.util.List;
import org.apache.camel.scr.internal.ScrHelper;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.component.mock.MockComponent;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.model.ModelCamelContext;
import org.apache.camel.model.RouteDefinition;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class CamelScrExampleTest {
Logger log = LoggerFactory.getLogger(getClass());
@Rule
public TestName testName = new TestName();
CamelScrExample integration;
ModelCamelContext context;
@Before
public void setUp() throws Exception {
log.info("*******************************************************************");
log.info("Test: " + testName.getMethodName());
log.info("*******************************************************************");
// Set property prefix for unit testing
System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");
// Prepare the integration
integration = new CamelScrExample();
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
context = integration.getContext();
// Disable JMX for test
context.disableJMX();
// Fake a component for test
context.addComponent("amq", new MockComponent());
}
@After
public void tearDown() throws Exception {
integration.stop();
}
@Test
public void testRoutes() throws Exception {
// Adjust routes
List<RouteDefinition> routes = context.getRouteDefinitions();
routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// Replace "from" endpoint with direct:start
replaceFromWith("direct:start");
// Mock and skip result endpoint
mockEndpoints("log:*");
}
});
MockEndpoint resultEndpoint = context.getEndpoint("mock:log:foo", MockEndpoint.class);
// resultEndpoint.expectedMessageCount(1); // If you want to just check the number of messages
resultEndpoint.expectedBodiesReceived("hello"); // If you want to check the contents
// Start the integration
integration.run();
// Send the test message
context.createProducerTemplate().sendBody("direct:start", "hello");
resultEndpoint.assertIsSatisfied();
}
}
现在,我们来看一个有趣的位。
使用属性前缀
// Set property prefix for unit testing
System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");
这样,您可以通过使用 "unit." 前缀来覆盖配置的部分。例如: unit. 覆盖单元测试。
from
前缀可用于处理路由可以运行的运行时环境之间的区别。通过开发、测试和生产环境移动未更改的捆绑包是典型的用例。
从注解获取测试配置
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
在这里,我们使用与 OSGi 环境中使用的相同属性,在测试中配置服务组件。
用于测试的模拟组件
// Fake a component for test
context.addComponent("amq", new MockComponent());
测试中不可用的组件可以像这样模拟以允许启动路由。
调整测试的路由
// Adjust routes
List<RouteDefinition> routes = context.getRouteDefinitions();
routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// Replace "from" endpoint with direct:start
replaceFromWith("direct:start");
// Mock and skip result endpoint
mockEndpoints("log:*");
}
});
Camel 的 AdviceWith 功能允许修改路由进行测试。
启动路由
// Start the integration
integration.run();
在这里,我们启动 Service 组件,并为其提供路由。
发送测试信息
// Send the test message
context.createProducerTemplate().sendBody("direct:start", "hello");
在这里,我们向测试中的路由发送一条信息。