使用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((), 全部效果(结实)
    }

发表评论

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