2014-10-28 54 views
0

我有这样的代码下面的JUnit MessageBoxProvider

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

我想测试(JUnit的)多少次performOverwrite称为(文件)的方法,我知道我可以使用验证的方法来测试,我的问题是MessageBoxProvider.questionMessageBox(shell, title, message),条件将成为只有当用户点击确定,但使用Junits,我怎么能使if条件正确?

+2

使用powermock like framework来模拟你的静态调用,并让它期望调用,并且你说那个方法返回true。 – SMA 2014-10-28 09:00:43

回答

1

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

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

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

    // ... 
} 

在您的类构造函数中,接受此类型的对象并将其存储。在你的测试中,你可以模拟这个对象并使用它来控制测试用户已经完成了什么。

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

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

+0

有什么办法来测试它维护现有的代码? – Ganesh 2014-10-28 09:25:12

+0

@Ganesh提到的方法[在评论](http://stackoverflow.com/questions/26604220/junit-for-messageboxprovider/26604507#comment41821396_26604220)将适用。 – 2014-10-28 09:44:33