294.4. 单元测试 Camel 路由
服务组件是一个 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(); } }
// 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");
// Set property prefix for unit testing
System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");
这可让您使用"单元"添加属性来覆盖配置的部分。例如,从 中进行单元测试的 unit.
覆盖。
from
前缀可用于处理可能会运行路由的运行时环境之间的区别。通过开发、测试和生产环境迁移未做的捆绑包是典型的用例。
从注解获取测试配置
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
此处我们使用 OSGi 环境中使用的相同属性在测试中配置服务组件。
模拟测试组件
// Fake a component for test context.addComponent("amq", new MockComponent());
// 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:*"); } });
// 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();
// Start the integration
integration.run();
此处我们启动 Service 组件及其路由。
发送测试信息
// Send the test message context.createProducerTemplate().sendBody("direct:start", "hello");
// Send the test message
context.createProducerTemplate().sendBody("direct:start", "hello");
此处我们发送消息到测试中的路由。