Iva*_*sul 2 java apache spring apache-camel
我最近开始研究Apache Camel,我有一个问题.我开始为我的路线编写一些测试,并且有很多例子,其中"to"部分路线被写为
<route id="person-add-route">
<from uri="direct:start"/>
<to uri="mock:result"/>
</route>
Run Code Online (Sandbox Code Playgroud)
所以,我写了一个测试,我正在考虑将mock:result作为last endproint.
@Test
@DirtiesContext
public void testCamel() throws Exception {
// Given
Object body = "body";
int messageCount = 1;
MockEndpoint endpoint = getMockEndpoint("mock:result");
// When
template.sendBody("direct:start", body);
// Then
endpoint.expectedMessageCount(messageCount);
endpoint.assertIsSatisfied();
}
Run Code Online (Sandbox Code Playgroud)
以下是问题:如果我想测试我的路线,那么编写mock是非常重要的吗?
您不需要在生产中包含"mock:result",有多种方法可以测试您的路线.一个是isMockEndpoints在你的Camel测试中实现:
@Override
public String isMockEndpoints()
{
return "*";
}
Run Code Online (Sandbox Code Playgroud)
所以如果你的路线是这样的:
<route id="person-add-route">
<from uri="direct:start"/>
<to uri="direct:result"/>
</route>
Run Code Online (Sandbox Code Playgroud)
您可以像这样检查MockEndpoint:
MockEndpoint endpoint = getMockEndpoint("mock:direct:result");
Run Code Online (Sandbox Code Playgroud)
您还可以使用AdviceWith在测试时修改您的路线,方法如下:
context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception
{
weaveAddLast().to("mock:result");
}
});
Run Code Online (Sandbox Code Playgroud)
此外,正如克劳斯在评论中提到的,请确保在将信息发送到路线之前设定您的期望.
上面(目前已接受)的答案非常旧,可能不再准确。今天实施类似的方法可能看起来像这样:
给定一个定义为 spring 组件的路由:
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class MyRoute extends RouteBuilder {
@Override
public void configure() {
from("direct:start").routeId("myRoute")
.setBody().simple("${body} world")
.process(exchange ->
exchange.getIn().setHeaders(Map.of("foo", "bar")));
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以按如下方式测试路由:
import org.apache.camel.CamelContext;
import org.apache.camel.EndpointInject;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.spring.junit5.CamelSpringBootTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.DirtiesContext;
import static org.apache.camel.builder.AdviceWith.adviceWith;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
@CamelSpringBootTest
@DirtiesContext
class MyRouteTest {
@Autowired
protected CamelContext camelContext;
@Produce("direct:start")
private ProducerTemplate from;
@EndpointInject("mock:result")
private MockEndpoint mockEndpoint;
@Test
void testMyRoute() throws Exception {
// arrange
adviceWith(camelContext, "myRoute",
route -> route.weaveAddLast().to("mock:result"));
mockEndpoint.expectedMessageCount(1);
// act
from.sendBody("hello");
// assert
mockEndpoint.assertIsSatisfied();
var result = mockEndpoint.getExchanges().get(0).getIn();
assertThat(result.getBody()).isEqualTo("hello world");
assertThat(result.getHeader("foo")).isEqualTo("bar");
}
}
Run Code Online (Sandbox Code Playgroud)
因此route.weaveAddLast().to("mock:result"),基本上所做的就是在路由中编织最后一步,将消息重定向到模拟:结果。
| 归档时间: |
|
| 查看次数: |
10463 次 |
| 最近记录: |