使用Mockito对异步方法进行单元测试

罕见风景

偶然人们必要用回调检验重大聚会,这刻薄的它们是异步家具的。这些办法不轻易检验。,应用(手写本)推迟直到到达它们家具是一种蹩脚的成真。,这让你的检验缺乏自信。。这么人们如何来对异步重大聚会停止检验呢?Mockito传送了人们!

示例

防备人们有独身成真DummyCallback电话话筒的DummyCaller类,在DummyCaller中有独身doSomethingAsynchronously()重大聚会,行使此重大聚会DummyCollaborator类的doSomethingAsynchronously(DummyCallback 回拨)重大聚会,行使重大聚会io时将此回调参量为DummyCaller靶子。当doSomethingAsynchronously(DummyCallback 回拨)当分给在在幕后线索中取得时,将行使回调。或许率直的读取信号轻易吗 :

DummyCallback电话话筒 :

public interface DummyCallback {
    public void onSuccess(List 成果)
    public void onFail(int 信号)
}

DummyCaller类 :

public class DummyCaller implements DummyCallback {
    // 家具异步用双手触摸、举起或握住的代劳类
    private final DummyCollaborator dummyCollaborator;
    // 家具成果
    private List result = new ArrayList();

    public DummyCaller(DummyCollaborator dummyCollaborator) {
        this.dummyCollaborator = dummyCollaborator;
    }

    public void doSomethingAsynchronously() {
        (这事)
    }

    public List getResult() {
        return this.result;
    }

    @Override
    public void onSuccess(List 成果) {
        this.result = result;
        (开 成)
    }

    @Override
    public void onFail(int 信号) {
        (开 错过)
    }
}

真正的异步家具用双手触摸、举起或握住的DummyCollaborator类:

public class DummyCollaborator {

    public static int ERROR_CODE = 1;

    public DummyCollaborator() {
        // empty
    }

    public void doSomethingAsynchronously (终极 DummyCallback 回拨) {
        new 螺旋环(新 Runnable() {
            @Override
            public void run() {
                try {
                    (5000);
                    ();
                } catch (InterruptedException e) {
                    (ERROR_CODE);
                    ();
                }
            }
        }).start();
    }
}

成立人们的检验类

人们有2种不一样的选择来检验人们的异步重大聚会,然而率先人们先成立独身DummyCollaboratorCallerTest检验类。

public class DummyCollaboratorCallerTest {

    // 要检验的典型
    private DummyCaller dummyCaller;

    @Mock
    private DummyCollaborator mockDummyCollaborator;

    @Captor
    private ArgumentCaptor dummyCallbackArgumentCaptor;

    @Before
    public void setUp() {
        (这事)
        dummyCaller = new DummyCaller(mockDummyCollaborator);
    }
}

在设置重大聚会中,人们应用mockito anotations设定初值 Mock和ArgumentCaptor,人们还不必要喜欢他们。

人们必要小心的是,人们设定初值仿照靶子,那么,这些设定初值信号在SETU中。记着,有要检验的功用都要检验两倍。。

让人们看一眼上面的两个检验风景。

[为人们的回调设置独身anwser]

人们应用doAnswer()来为独身重大聚会停止强迫以检验异步重大聚会的检验用例。doanswer通常与whe兼备应用。,当合格证书缓和时,家具确切的的应对办法,免得answer办法引起非常,因而检验无经过。。

这刻薄的人们必要了解又来回调(同时性,当行使检验做成某事办法时,人们形状独身流通时间的anwser,将家具此回调。首要的,人们异步行使dosomething重大聚会,坚信礼了国家的和间隔成果。。

@Test
    public void testDoSomethingAsynchronouslyUsingDoAnswer() {
        final List results = (开e", "Two", 三)。
        // 对callbac家具同时性anwser
        doAnswer(new Answer() {
            @Override
            public Object answer(InvocationOnMock 行使) throws Throwable {
                ((DummyCallback)()[0]).onSuccess(results);
                return null;
            }
        }).when(mockDummyCollaborator).doSomethingAsynchronously(
                any());

        // 行使TES下的重大聚会
        ();

        // 坚信礼国家的和成果
        verify(mockDummyCollaborator, times(1)).doSomethingAsynchronously(
                any());
        assertThat((), 值得的(成果)
    }

【应用ArgumentCaptor】

其次个成真是应用argumentCapto。在这时人们的callback是异步的: 人们经过ArgumentCaptor赶上发射到DummyCollaborator靶子的DummyCallback回调。

终极,人们可以在检验功用安排停止有坚信礼,当人们想坚信礼国家的和间隔成果时可以行使onSuccess()

@Test
    public void testDoSomethingAsynchronouslyUsingArgumentCaptor() {
        // 行使要检验的重大聚会
        ();

        final List results = (开e", "Two", 三)。

        // Let''s call the 回拨。 ArgumentCaptor.capture() works like a 比赛匠。
        verify(mockDummyCollaborator, times(1)).doSomethingAsynchronously(
                ());

        // 家具回调前坚信礼成果
        assertThat(().isEmpty(), 是(真)

        // 行使回调onSuccess重大聚会
        ().onSuccess(results);

        // 再次坚信礼成果
        assertThat((), 值得的(成果)
    }

发表评论

电子邮件地址不会被公开。 必填项已用*标注