使用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((), 胜任的(结出果实)
    }

发表评论

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