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

发表评论

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