如何在MVP中对演示者进行单元测试

时间:2015-05-11 21:45:20

标签: java unit-testing

我有一个模型视图演示者三合一。我想知道测试演示者的常用方法是什么。

我想到的第一件事就是实例化演示者并实例化一个真实的视图,然后断言视图将完成预期的行为。

public void itShouldSayHello() {
    View view = new View();
    Presenter presenter = new Presenter(view);
    presenter.userSaid("hello");
    assertTrue(view.getGreeting().equals("hello"));
}

然后我认为视图没有经过测试,所以我创建了一个假视图。

private String greeting;

public void itShouldSayHello() {
    View view = new FakeView();
    Presenter presenter = new Presenter(view);
    presenter.userSaid("hello");
    assertTrue(greeting.equals("hello"));
}
private class FakeView implements View {
    @Override
    public void displayGreeting(String saluto) {
        greeting = saluto;
    }
}

然后我认为视图的界面可能会改变。这将使代码难以维护。所以我编写了测试并断言要将某些内容呈现给视图。这样即使接口改变了,我也不得不在测试中改变一行代码。

public void itShouldSayHello() {
    View view = mock(View.class);
    Presenter presenter = new Presenter(view);
    presenter.userSaid("hello");
    verify(view).displayGreeting("hello");
}

所以基本上我现在测试的是,我希望演示者收集并处理一些信息,最后将其传递给视图,然后我验证传递的值是否正确。

所以我想我现在不使用假冒,我使用模拟然后验证模拟是否收到正确的值。

我遇到的另一个问题是模型。但我认为这是不可逾越的。我要做的就是要确定演示者是否正常运行是为了创建一个大的脂肪夹具。然后传递所有各种组合,看看演示者的行为是否正确。

您如何测试演示者?

1 个答案:

答案 0 :(得分:2)

您利用视图/演示者的分离来测试演示者。如果您已完全实施MVP,您的View将实现一个界面,您的Presenter将使用该界面将数据返回到View。如果您正在测试MVP应用程序,您不仅需要Presenter正常运行,还需要View用于与Presenter通信的界面。

因此,您的测试类应该实现View的接口,调用Presenter的方法,并从覆盖接口的本地方法存储Presenter的响应。如果Presenter同步与业务层通信,则更容易:

  1. 定义实现View接口的测试类
  2. 在测试类中实现接口,以便由演示者准备的数据存储在测试对象中
  3. 在测试类中创建调试方法,调用演示者,从对象获取响应,并执行适当的比较。
  4. 如果您的Presenter以异步方式进行通信,则必须执行类似等待测试方法的操作并通过接口方法进行通知。