使用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((), 胜任(终于)
    }

发表评论

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