首页 > 解决方案 > 单元测试 Spring ApplicationEventPublisher

问题描述

我正在尝试为以下代码编写单元测试:

public void doSomething(List<Object> someObjects){
    // Some logic I want to test...

    eventPublisher.publishEvent(someEvent);
}

所以在项目中我调用这个方法来对对象列表执行一些逻辑,然后它发布应用程序事件,结果是一个被接收的方法。

我想用单元测试验证该方法内部的逻辑,但如果该方法不直接返回任何内容但发布域事件,我不确定如何编写单元测试。这样做的正确方法是什么?

谢谢你的帮助。

标签: springjunit

解决方案


作为单元测试的一部分,验证 `eventPublisher. 用正确的参数调用。另外,请记住,单元测试是要测试的方法的每一行代码的文档。

您必须模拟eventPublisherin 测试并使用ArgumentCaptor它来捕获在调用消息时传递的参数。

理想情况下,您的测试应如下所示:

public class ClassToBeTestedTest {

    @Mock
    private ApplicationEventPublisher eventPublisher;

    @InjectMocks
    private ClassToBeTested classToBeTested;

    @Captor
    private ArgumentCaptor<SomeClass> captor;

    @Before
    public void init() {
        initMocks(this);
    }

    @Test
    public void testSend() throws Exception {

        classToBeTested.doSomething(Arrays.asList());

        verify(eventPublisher).publishEvent(captor.capture());
        assertThat(captor.getValue(), is("expected value"))
    }

}   

推荐阅读