java - 安卓单元测试 : How to mock a listener that is sent as argument to an asynchronous method?

标签 java android unit-testing asynchronous mocking

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

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

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")) 时成功

谢谢!

最佳答案

对于这种情况,我使用 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 .

关于java - 安卓单元测试 : How to mock a listener that is sent as argument to an asynchronous method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335543/

相关文章:

java - 一个类从两个来源继承方法

java - 小时是否在跨越 2 天的时间范围内?

java - Eclipse Android NEON : Tons of errors

java - 回收站适配器 onClick 项目出现问题

unit-testing - 初始化循环 Golang

c# - 无法为通用可枚举任务设置起订量模拟

unit-testing - phpunit 模拟期望因方法名称相等而失败

java - Spring 3、Hibernate 4.1 Maven 3 教程?

java - 子类构造函数 - 为什么子类构造函数必须存在默认构造函数?

android - 单击 ListActivity 中的事件监听器