【发布时间】:2017-09-15 00:56:21
【问题描述】:
我希望能够测试从队列中消耗的路由,然后在涉及 spring 注入服务的 bean 中做一些工作,并使用 mockito 来有效地模拟这个服务。
我的春季路线如下:
<camel:route id="msgemailqueue-to-emailservice">
<camel:from uri="activemq:emails" />
<camel:bean ref="emailService" method="createEmailRequest"/>
</camel:route>
emailService bean 有一个自动连接的服务,然后在 createEmailRequest() 中调用该服务,该服务转到另一个服务并检索用户数据以供随后使用。
测试:
@RunWith(MockitoJUnitRunner.class)
public class TroubledEmailServiceImplTest extends CamelSpringTestSupport {
@Produce(context = "messagingCamelContext")
protected ProducerTemplate producer;
@Mock
private UserRestService userRestService;
@Override
protected AbstractApplicationContext createApplicationContext() {
return new ClassPathXmlApplicationContext("messaging-camel-route-test-context.xml");
}
@Test
public void testUserResponseToEmailQueue() throws Exception {
context.addRoutes(new MyDynamcRouteBuilder(context, "direct:addEmailRequest", "activemq:emails"));
Mockito.when(userRestService.getUserById(Mockito.anyLong())).thenReturn(
new WebServiceResult<UserVO>(new UserVO()));
CreateMessageRequest msgReq = new CreateMessageRequest();
producer.sendBody("direct:addEmailRequest", msgReq);
Mockito.verify(userRestService).getUserById(Mockito.anyLong());
assertMockEndpointsSatisfied();
}
bean如下:
@Override
public void createEmailRequest(final CreateMessageRequest request) throws CreateEmailException {
LOGGER.trace("Entering createEmailRequest(request) " + Arrays.asList(new Object[] { request }));
Validate.notNull(request, "CreateMessageRequest was null");
WebServiceResult<UserVO> response;
try {
response = userRestService.getUserById(request.getId());
} catch (final WebServiceException e) {
throw new CreateEmailException("Error lookup up user data for email", e);
}
final UserVO userResponse = response.getData();
所有编译都正常,并且在运行路由时会触发,因为队列中会弹出一个对象,然后将其传递给 bean 并调用 createEmailRequest 并且对 mockito 模拟服务的调用正常
response = userRestService.getUserById(request.getId());
但即使响应为空
Mockito.when(userRestService.getUserById(Mockito.anyLong())).thenReturn(
new WebServiceResult<UserVO>(new UserVO()));
在测试中执行。似乎 bean 中的服务是一个不同的实例,即永远不会调用 mockito mock。
我做错了什么,也许我的测试方法也全错了,但这在理论上应该可行吗?我真的很希望能够在我的骆驼路线中模拟一个 bean 中的服务。
【问题讨论】:
标签: spring unit-testing apache-camel mockito