我有一个我正在研究的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));