【问题标题】:Spring Integration - Mockito.verify().someMethod () - error Wanted but not invokedSpring Integration - Mockito.verify().someMethod () - 错误想要但未调用
【发布时间】:2016-03-08 13:43:51
【问题描述】:

这是关于我在测试服务激活器时面临的问题。使用的技术是 - Spring 与 Redis 集成 - 使用 RedisQueueOutboundChannelAdapter 和 RedisQueueMessageDrivenEndpoint。
申请代码可以在链接https://github.com/SRekha-LV/SISamples/tree/master/SpringRedisTestEg找到 Flow - HomeController 向 Service Activator 方法发送异步消息 - ProcessQueue1Messages 类中的 processQueue1Details()。

目的是测试否。方法 - processQueue1Details () 被调用的次数。相同的示例测试用例在测试类 - TestHitCount.java - testProcessQueue1 () 中。

执行此操作会出现异常“需要但未调用: processQueue1Messages.processQueue1Details( GenericMessage [payload=TEst, headers={timestamp=1457436349427, id=d1b622d4-43b1-dfc4-e114-2ae700cbdb6c}] ); -> 在 com.spring.mvc.redis.TestHitCount.testProcessQueue1(TestHitCount.java:42) 实际上,与此模拟的交互为零。”

需要帮助。

提前感谢大家的支持。

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    您的应用程序非常复杂,而且您的问题已经够脏了。这就是为什么有人已经对您的问题投了反对票。

    我真的无法掌握你的配置和测试,但我有两个建议:

    1. 在 Spring Integration 中,您应该将 @ServiceActivator 用于 MessageHandler @Beans。为了能够从频道消费并处理消息,例如像所有RedisQueueOutboundChannelAdapters 一样将其发送到 Redis 列表。

    2. 如果您测试async 场景,另一方面,您必须在调用.verify() 之前等待 等待结果。例如。在您的情况下,您发送到 Redis 并退出。与您的mock 确实没有任何互动。

    3. 让我们仔细看看你的代码!

      @Test
      public void testProcessQueue1 () {
          ProcessQueue1Messages pQueue1Msgs =  Mockito.mock(ProcessQueue1Messages.class);
          Object strObj = "TEst";
          Message<Object> message = MessageBuilder.withPayload(strObj).build();
          rulesRQOutboundChannelAdapter.handleMessage(message);
      
          Mockito.verify(pQueue1Msgs).processQueue1Details(message);
      }
      

    您在测试中创建了mock,却没有提供它。那么你的 Spring 应用程序应该如何与 mock 交互,如果它只是局部变量呢?

    【讨论】:

    • 谢谢你们的cmets,我承认。
    • 实际上这是我的应用程序的示例代码。我是 Spring 集成和使用 mockito 编写测试的新手。需要测试消息端点以确保正确处理所有发送的消息。在这个过程中我尝试创建一个测试方法来仅测试消息端点——ProcessQueue1Messages。在此过程中不会触及控制器中的异步调用。因此没有添加任何等待验证方法。
    • 好的。请再次查看您的测试用例代码。没有人使用您的 pQueue1Msgs 变量。这是死代码。如果您不将 pQueue1Msgs 注入到您的流程中涉及的某些实际服务中,将如何验证它。从另一边rulesRQOutboundChannelAdapter 只是向 Redis 发送消息,如果您不等待某些事情,您将如何验证您的消息是否已到达 Redis 并已从那里正确弹出?
    • redis配置在文件com.spring.mvc.config.AppRedisConfig中。 rulesRQoutboundChannelAdapter 的示例配置是
    • @Bean RedisQueueOutboundChannelAdapter rulesRQOutboundChannelAdapter () { RedisQueueOutboundChannelAdapter redisPublisher = new RedisQueueOutboundChannelAdapter( rulesQueue, jedisConnectionFactory ()); return redisPublisher; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多