如何对没有出现GUI的情况下生成另一个视图的演示者进行单元测试?

时间:2012-02-17 15:38:49

标签: java unit-testing mvp

我有一个演示者类,它将生成一个新的演示者并在成功执行时查看。在产生下一个演示者/视图之前,一些业务逻辑执行我希望进行单元测试。我的问题是,当我的单元测试执行时,我无法避免出现实际的GUI窗口。

以下是一些用于演示此问题的伪代码:

// View1 and Model are interfaces
public Presenter1(View1 view, Model model) {
  // ....
}


public void handleOKClick() {
  // Method triggered by view

  String data = view.getSomeUserInput();
  // ... business logic I wish to test  


  if (shouldLoadNextView) {
    // Business logic concluded the next view should be loaded

    View2 nextView = new View2Impl();
    Presenter2 nextPresenter = new Presenter2(nextView, model);
    nextView.setPresenter(nextPresenter);
    nextView.showView();
  }
}

在我的单元测试中,我可以模拟传递给View1构造函数的ModelPresenter1个实例。然后,我可以检查我的业务逻辑是否按预期与这些逻辑交互。我目前无法做的是阻止显示下一个视图,因为我的Presenter1实例将构建View2的具体实现并显示它。

我觉得我有三个选择:

  1. 改变班级的设计。也许Presenter1构造函数应该将View2实例作为参数,允许我为了测试而模拟它。

  2. 找到一种狡猾的方法,一旦它出现,就从我的单元测试代码中删除它。我不确定如何做到这一点。

  3. 对我的项目类设计进行更根本的更改,以便演示者不会以这种方式生成新视图。

2 个答案:

答案 0 :(得分:1)

如果我是你,我会选择选项3,让你的主持人通过其他视图的事件进行交流,这样你就可以让它们松散耦合,演示者会变得更容易测试,更容易实现。

答案 1 :(得分:1)

时间过去了,我已经采用了选项1.当可能不需要时,预先构建视图会感到笨拙,但同样我的视图类也很轻巧,构建起来很便宜。