使用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((), 折合(奏效)
    }

发表评论

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