gen*_*qew 3 apache-camel spring-test spring-boot
我目前正在使用 Camel 的模拟组件,我想在现有的路线上测试它。基本上我想保留应用程序中定义的现有路由,但在测试期间注入一些模拟,以验证或至少查看当前的交换内容。
基于文档和 Apache Camel Cookbook。我尝试过使用@MockEndpoints
这是路线构建器
@Component
public class MockedRouteStub extends RouteBuilder {
private static final Logger LOGGER = LoggerFactory.getLogger(MockedRouteStub.class);
@Override
public void configure() throws Exception {
from("direct:stub")
.choice()
.when().simple("${body} contains 'Camel'")
.setHeader("verified").constant(true)
.to("direct:foo")
.otherwise()
.to("direct:bar")
.end();
from("direct:foo")
.process(e -> LOGGER.info("foo {}", e.getIn().getBody()));
from("direct:bar")
.process(e -> LOGGER.info("bar {}", e.getIn().getBody()));
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试(目前是一个 springboot 项目):
@RunWith(SpringRunner.class)
@SpringBootTest
@MockEndpoints
public class MockedRouteStubTest {
@Autowired
private ProducerTemplate producerTemplate;
@EndpointInject(uri = "mock:direct:foo")
private MockEndpoint mockCamel;
@Test
public void test() throws InterruptedException {
String body = "Camel";
mockCamel.expectedMessageCount(1);
producerTemplate.sendBody("direct:stub", body);
mockCamel.assertIsSatisfied();
}
}
Run Code Online (Sandbox Code Playgroud)
消息计数为 0,看起来更像是 @MockEndpoints 未触发。另外logs表示日志被触发
route.MockedRouteStub : foo Camel
Run Code Online (Sandbox Code Playgroud)
我尝试过的另一种选择是使用建议:
...
@Autowired
private CamelContext context;
@Before
public void setup() throws Exception {
context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
mockEndpoints();
}
});
}
Run Code Online (Sandbox Code Playgroud)
启动日志表明建议已到位:
c.i.InterceptSendToMockEndpointStrategy : Adviced endpoint [direct://stub] with mock endpoint [mock:direct:stub]
Run Code Online (Sandbox Code Playgroud)
但我的测试仍然失败,消息计数 = 0。
发布适用于我的设置的答案。
如果不对 RouteBuilder 进行任何更改,测试将如下所示:
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@MockEndpoints
public class MockedRouteStubTest {
@Autowired
private ProducerTemplate producerTemplate;
@EndpointInject(uri = "mock:direct:foo")
private MockEndpoint mockCamel;
@Test
public void test() throws InterruptedException {
String body = "Camel";
mockCamel.expectedMessageCount(1);
producerTemplate.sendBody("direct:stub", body);
mockCamel.assertIsSatisfied();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5852 次 |
| 最近记录: |