【问题标题】:Android Unit Test: How to mock a listener that is sent as argument to an asynchronous method?Android单元测试:如何模拟作为参数发送给异步方法的监听器?
【发布时间】:2016-07-20 00:47:57
【问题描述】:

我有一个使用 onSuccess(result) 和 onFail(error) 方法接收侦听器(接口)的方法。
被测试的方法执行一些操作(在另一个线程上)并最终调用监听器并给出答案。

方法本身(不是测试)的示例代码:

testedObject.performAsyncAction("some data", new IListener(){
    @Override
    public void onSuccess(int result) {
        if (result == 1) { /* do something */ }
        else if (result == 2) { /* do something else */ }
    }

    @Override
    public void onFailure(Error error) {
        if (error.getMessage().equals("some error")) { /* do something */ }
        else if (error.getMessage().equals("another error")) { /* do something else */ }
    }
});

我想对此方法进行一些测试:

  • 调用 onSuccess(1) 时成功
  • 调用 onSuccess(2) 时成功
  • 调用 onFailure(new Error("some error")) 时成功
  • 调用 onFailure(new Error("another error")) 时成功

谢谢!

【问题讨论】:

    标签: java android unit-testing asynchronous mocking


    【解决方案1】:

    对于这种情况,我使用 Mockito Answer 对象。这将是一个成功案例的测试:

    Answer<Void> myAnswer = new Answer<Void>() {
        public Void answer(InvocationOnMock invocation) {
           Callback callback = (Callback) invocation.getArguments()[1]; // second argument in performAsyncAction 
           callback.onSuccess(1); // this would be 1 or 2 in your case
           return null;
        }
    };
    
    doAnswer(myAnswer).when(testedObject).performAsyncAction("some data", any(Callback.class));
    

    对于失败的情况,只需创建另一个具有不同答案的测试。欲了解更多信息,请查看此blog post。

    【讨论】:

    • 谢谢。但我不想模拟 performAsyncAction。我想测试一下。其实我已经想出了如何模拟听众。现在剩下的部分是如何设置超时,以便测试等到 performAsyncAction 完成。 (我知道最好避免异步测试,但是我这里必须用单元测试来测试这个异步调用)。
    • 好的,所以对于异步单元测试,我用来在测试中用同步元素替换异步元素。这将使测试更容易。例如,如果我在真实代码中使用线程池执行器,在测试中我将其替换为同步执行器(它同步执行可运行对象)
    • 是的,我也用同步模拟替换了异步方法。但有时我想按原样测试异步功能。这是我的问题。在 iOS 中,这很容易做到……
    • @MichaelKessler 我认为您正在寻找类似 Awaitility 的东西:github.com/awaitility/awaitility 我用它来测试异步功能,它很棒。但是,请注意,在使用 Awaitlity 时,我认为这些不再是单元测试,而是真正的集成测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2014-01-18
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多