Android:JUnit + Mockito,测试回调?

Jes*_*rQv 6 java junit android unit-testing mockito

我有一个Android正在开发的应用程序,试图为此编写单元测试。该应用程序是使用MVP架构编写的,我正在尝试测试Presenter类。

我要测试的简化方法如下所示:

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

现在,我想验证在userPressedButton调用方法时是否view.showData(data)已调用。

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

有任何想法吗?

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

Mac*_*ski 7

有趣的案例。

我要做的是:

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

public class MyCallback implements Callback<Data>{

    private View view;

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

    @Override
    onResponse(Data data) {
        view.showData(data);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在对于这个类,您可以编写一个单元测试来检查该onResponse方法是否调用了showDataview字段的方法。

2)将实现提取到一个具体的类中,从包含userPressedButton方法的类的角度来看,Callback 类内部发生的事情实际上并不重要。重要的是该接口的具体实现已经通过:

public void userPressedButton() {
    service.loadData(new MyCallback(view));
}
Run Code Online (Sandbox Code Playgroud)

最后是测试:

@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);
}
Run Code Online (Sandbox Code Playgroud)

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

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