如何骆驼路线测试春豆与mockito嘲笑豆

时间:2014-07-30 16:08:46

标签: spring unit-testing apache-camel mockito

我希望能够测试从队列中消耗的路由,然后在涉及弹簧注入服务的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。

我做错了,也许我的测试方法也错了,但这应该在理论上有效吗?我真的希望能够在我的骆驼路线中模拟豆子中的服务。

3 个答案:

答案 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。