首页 > 解决方案 > Mockito 验证与添加到线程本地侦听器的已创建模拟的交互

问题描述

在每次测试后,我使用 mockito 来验证与我的 mock 的交互次数。有些测试可能有很多模拟,所以为了避免在调用时出现长长的参数列表,Mockito.verifyNoMoreInteractions我尝试通过Mockito.framework().addListener.

我的测试班

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyClass.class, MockitoConfig.class})
@SpringBootTest
public class MyClassTest {

    @Autowired
    private MyClass myClass;

    @Autowired
    private MockCollector mockCollector;

    @MockBean
    private MyMock myMock;

    @After
    public void after() {
        verifyNoMoreInteractions(mockCollector.getMocks().toArray());
    }

    @Test
    ...
}

我的配置类

@Configuration
public class MockitoConfig {

    @Bean
    public MockCollector mockCollector() {
        return new MockCollector();
    }

    public class MockCollector {

        private final List<Object> createdMocks = new ArrayList<>();

        public List<Object> getMocks() {
            return createdMocks;
        }

        public MockCollector() {
            Mockito.framework().addListener((MockCreationListener) (mock, settings) -> createdMocks.add(mock));
        }
    }
}

我创建了这个配置类,所以整个 addListener 只调用一次以避免任何RedundantListenerException.

这里的问题是,当在方法中查询时,我的模拟列表是空的after。当我直接在after方法中移动 MockCollector 的代码时,它在第一次测试中效果很好,并且在第二次测试之后显然失败了,因为RedundantListenerException.

我在这里想念什么?还有另一种方法可以在这里执行我想要的吗?

标签: javaspringjunitmocking

解决方案


推荐阅读