Android:JUnit + Mockito,测试回调?

时间:2017-03-02 16:41:54

标签: java android unit-testing junit mockito

我有一个Android应用程序,我正在努力并尝试为其编写单元测试。该应用程序是使用MVP架构编写的,我正在尝试测试Presenter类。

简化方法我试图测试看起来像这样:

public void userPressedButton() {
    service.loadData(new Callback<Data>{
        @Override
        onResponse(Data data) {
            view.showData(data);
        }
    });
}

现在我要验证调用userPressedButton方法时调用view.showData(data)方法[masters] server1 server2 server3 server4 server5 server6

我尝试了几种方法,但我似乎无法弄清楚如何测试它。

有什么想法吗?

编辑:澄清一下,我想写一个单元测试

3 个答案:

答案 0 :(得分:3)

有趣的案例。

我要做的是:

1) - 为该特定回调创建具体类:

public class MyCallback implements Callback<Data>{

    private View view;

    public MyCallback(View view){
        this.view = view;
    } 

    @Override
    onResponse(Data data) {
        view.showData(data);
    }
}

现在,您可以编写单元测试来检查onResponse方法是否调用showData字段的view方法。

2)从包含userPressedButton方法的类的角度来看,已经将实现扩展到具体的类,在Callback类中发生的事情并不重要。 重要的是,已经传递了该接口的具体实现:

public void userPressedButton() {
    service.loadData(new MyCallback(view));
}

最后测试:

@InjectMocks
MyClass myClass;

@Mock
Service service;

@Captor
ArgumentCaptor argCaptor;

@Before
public void init(){
     MockitoAnnotations.initMocks(this);
}

@Test
public void shouldUseMyCallback(){
     // Arrange

     // set up myClass for test

     // Act
     myClass.userPressedButton();

    Mockito.verify(service).loadData(argCaptor.capture());

    // Assert
    assertTrue(argCaptor.getValue instance of MyCallback);
}

因此,我们检查是否已通过正确实现调用loadData方法。

这就是我如何测试你的情况。

答案 1 :(得分:0)

你可以&#34;存储&#34;回调并在测试期间使用测试回调

class YourClass {

    private ??? view;
    private Callback<Data> callback;

    // for testing purposes
    protected YouClass(Callback<Data> callback) {
        this.callback = callback;
    }

    public YouClass() {
        this(new Callback<Data>{
            @Override
            onResponse(Data data) {
                view.showData(data);
            }
        });
    }

    public void userPressedButton() {
        service.loadData(this.callback);
    }
}

然后为您的测试使用一些自定义回调

答案 2 :(得分:-1)

更简单的解决方案。如果这是MVP,您可以将view实例传递给演示者类。然后在Mock上测试调用。

这就是测试方法的样子:

MVPView view = mock(MVPView.class);
Presenter presenter = new Presenter(view)
presenter.userPressedButton();
verify(view, atLeastOnce()).showData(any(Data.class));

如果调用是异步的,那么等待结果,修改最后一个语句:

verify(view, timetout(5000).atLeastOnce()).showData(any(Data.class));