当前位置: 首页 > 知识库问答 >
问题:

不能存根SimpleMessageListenerContainer isActive方法[Spring AMQP Rabbit]

司徒元明
2023-03-14
@Configuration
public class SpringEventsListeners {
    private static CPLocation cpLocation = CPLoggingFactory.createCPLocation(SpringEventsListeners.class);

    private ConfigurationServiceImpl configService;

    //Constructor Injection for Testability.
    public SpringEventsListeners(final ConfigurationServiceImpl configService) {
        this.configService = configService;
    }

    /**
     * Rabbit listeners might be started/stopped after a refresh depending on a property.
     * In case a change is needed, we perform it.
     */
    @EventListener(classes= { ApplicationReadyEvent.class, EnvironmentChangeEvent.class })
    public void handleRabbitListenerToggle() {
        String method = "handleRabbitListenerToggle";
        cpLocation.info(method, "Received refresh event. Determining action.");
        
        boolean shouldActivateRabbit = configService.shouldActivateRabbitListeners();
        for (SimpleMessageListenerContainer container : configService.getAllRabbitSimpleMessageListenerContainers()) {
            if (shouldActivateRabbit && !container.isActive()) {
                container.start();
                cpLocation.info(method, "Starting container: "+Arrays.toString(container.getQueueNames()));
            }
            else if (!shouldActivateRabbit && container.isActive()) {
                container.shutdown();
                cpLocation.info(method, "Shutting down container: "+Arrays.toString(container.getQueueNames()));
            }
        }
    }
    
}
@RunWith(MockitoJUnitRunner.class)
public class SpringEventsListenersTests {

    @InjectMocks
    private SpringEventsListeners classUnderTest;

    @Mock
    private ConfigurationServiceImpl mockConfigurationService;

    @Mock
    private SimpleMessageListenerContainer mockSimpleMessageListenerContainer;

    @Test
    public void testToggleTrue() {
        //Given
        given(mockConfigurationService.shouldActivateRabbitListeners()).willReturn(true);
        given(mockConfigurationService.getAllRabbitSimpleMessageListenerContainers()).willReturn(Arrays.asList(mockSimpleMessageListenerContainer));
        given(mockSimpleMessageListenerContainer.isActive()).willReturn(false);
        //When
        classUnderTest.handleRabbitListenerToggle();
        Assert.assertThat(true, is(true));
    }
}

我还需要断言。shutdown或。start是在容器上调用的,因此需要对其进行模拟。

共有1个答案

司马晋
2023-03-14

Mockito不能模拟final方法(isactive()是final)。

您可以使用反射(例如DirectFieldAccessor)来检查Active字段。

也就是说,嘲笑监听器容器是相当不寻常的;它是一段复杂的代码;也许你能准确地解释一下你想测试的是什么?

 类似资料:
  • 当Iam在Mockito中使用anyString()或anyInt()或anyLong()方法时,stubbing不起作用。如果我使用anyObject(),它工作得很好。例如,如果我们有使用此签名的方法: 嘲笑: 当在测试的方法内部调用此模拟时,它将抛出NullPointerException。但是如果我们为anyObject()更改它,一切都很好。有人知道为什么anyString()会导致Nu

  • 问题内容: 这是我要做的: 为下面的main()调用的方法定义存根。每个存根应打印“ FIXME:完成methodName()”,后跟换行符,并应返回-1。 输出示例: 这是我的代码: 我以为我理解方法存根,但是我感觉自己犯了一个非常愚蠢而简单的错误?我只能编辑代码的公共static int methodName部分。 问题答案: 从这个意义上讲,方法存根是没有实质内容的方法,即它没有按照计划执行

  • 我正在尝试使用sinon存根替换一个可能需要很长时间的函数。但是当我运行测试时,测试代码似乎没有使用sinon存根。 这是我要测试的代码。 这是测试代码。 我得到一个断言错误 我做错了什么?为什么不使用存根?摩卡的测试框架。

  • 我有一个使用node-slack-sdk的Express应用程序,当某些endpoint被击中时,它会使帖子松弛。我正在尝试为一个路由编写集成测试,其中包括调用该库中的方法。 我想从Slack库中阻止某些方法的所有默认行为,并简单地断言这些方法是用某些参数调用的。 我试图把问题简单化。如何建立实例的方法(实际上嵌套在中)的存根,阻止原始功能,并断言它是用什么参数调用的? 我尝试了很多没有成功的东西

  • 当对进行stubbing时,我会得到以下关于用返回值对void方法进行stubbing的错误消息,尽管不是void。该错误似乎与有关,尽管我正在插入。 我的测试: 为什么会发生这种情况,我如何修复它?

  • 我试图通过在传入字符串“John”时返回一个用户对象来建立类(spring-data-jpa存储库)的方法。 发生的情况是,在userService中,当调用users.findbyUsername(“John”)时,它总是返回null,而不是我定义的任何用户对象: 当我在测试方法中放置断点并比较users和UserService.users时,它们是相等的。 pom版本