我有下面的代码

      if (MessageBoxProvider.questionMessageBox(shell, title, message)) {
            return performOverwrite(file);
        }


我想测试(JUnit)调用了performOverwrite(file)方法多少次,我知道我可以使用verify方法进行测试,我的问题是MessageBoxProvider.questionMessageBox(shell, title, message),只有当用户单击确定时条件才变为true,但是使用Junits,如何我使if条件成立吗?

最佳答案

如果将用户界面代码混入其中,则单元测试业务逻辑将变得非常复杂。理想情况下,您应该采用一种设计模式,例如MVC或MVP,可以完全避免这种情况。

如果您不能或不会沿着那条路线走,请考虑定义一个包含所有消息框方法的接口。例如。

public interface MessagePrompter {
  boolean poseQuestion(title, message);

  // ...
}


在您的类构造函数中,接受此类型的对象并将其存储。在测试中,您可以模拟该对象并使用它来控制测试用户的操作。

在生产代码中,使用此接口的具体实现来调用MessageBoxProvider方法。

这种方法的好处是使您的应用程序更具可移植性。如果要发布命令行版本或基于Web的版本,只需更改具体实现的行为方式即可。

10-08 04:01