Android:Junit Mockito,测试回调



我有一个我正在研究的Android应用程序,并尝试为其编写单元测试。该应用程序是使用MVP架构编写的,我正在尝试测试演示者类。

我正在尝试测试这样的简化方法:

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

现在,我想验证当userPressedButton方法称为view.showData(data)时。

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

有什么想法?

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

有趣的情况。

我要做的是:

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方法是否调用view字段的showData方法。

2)从包含userPressedButton方法的类的角度将实现扩展到具体类,这实际上不是必需的回调类内部发生的事情。重要的是要通过该接口的具体实现:

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方法。

那就是我将如何测试您的案例。

您可以"存储"回调并在测试过程中使用测试回调

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);
    }
}

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

更简单的解决方案。如果这是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));

相关内容

  • 没有找到相关文章

最新更新