我有一个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
。
我尝试了几种方法,但我似乎无法弄清楚如何测试它。
有什么想法吗?
编辑:澄清一下,我想写一个单元测试
答案 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));