2017-03-02 112 views
3

我有一个Android应用程序,我正在努力为它编写单元测试。该应用程序是用MVP架构编写的,我试图测试Presenter类。Android:JUnit + Mockito,测试回调?

简化方法我想测试看起来是这样的:

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

现在我想确认的是,当userPressedButton方法被调用view.showData(data)被调用。

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

任何想法?

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

+0

只是要确定。你想写单元测试吗?不是综合测试 –

+0

Maciej Kowalski是的,这是正确的! – JesperQv

回答

1

有趣的案例。

我会做的是:

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)已经extacted落实到一个具体的类,从包含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方法是否调用了适当的实现。

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

0

你可以“储存”的回调,并在测试期间使用测试回调

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

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

-1

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

这是一个测试方法是什么样子:

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

如果呼叫asynchronious,然后等待结果,通过修改最后声明:

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

谢谢你的回答!即使loadData方法进行网络调用,这是否也能工作? – JesperQv

+0

然后,你也必须模拟“服务”行为。 –