我希望能够测试从队列中消耗的路由,然后在涉及弹簧注入服务的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。
我做错了,也许我的测试方法也错了,但这应该在理论上有效吗?我真的希望能够在我的骆驼路线中模拟豆子中的服务。
答案 0 :(得分:2)
我正在使用 Camel增强型弹簧测试并且已经通过了同样的问题。我只将@Mock
更改为@MockBean
。我的Camel版本是2.18。
答案 1 :(得分:1)
您在测试中创建的模拟userRestService必须与您在bean中使用的实例相同。我没有看到您为createEmailRequest方法设置userRestService的位置。该服务需要与您在测试中创建的模拟对象相同。
答案 2 :(得分:1)
我已经解决了这个问题 - mea culpa。我的测试类有效地创建了两个服务实例 - 一个是通过spring应用程序上下文,另一个是@RunWith(MockitoJUnitRunner.class)加上@mock注释。现在通过模拟创建一次解决。总而言之,这只是我的弹簧接线问题。非常感谢@ mike-pone。