我想编写一个测试用例来验证我班级中的方法。
我的方法中有一个本地ApplicationLauncher
对象必须被模拟,因为它调用了一个方法launch()
,不应该在单元测试中调用它。
public class RunApp
{
public void check(String name)
{
if(name !=null)
{
ApplicationLauncher launcher = Application.getLauncher("launch");
String appName = name+".bat";
launcher.launch(appName);
}
}
}
我的JUnit测试代码如下:
RunApp runapp = new RunApp();
@Mock
ApplicationLauncher launcher;
@Test
public void test()
{
runapp.check("test");
verify(launcher,atLeastOnce).launch(anyString());
}
我无法返回像
这样的模拟对象when(Application.getLauncher(anyString())).thenReturn(launcher);
因为getLauncher
是Application
类中的静态方法。我该如何解决这个问题?
答案 0 :(得分:3)
更好的应用程序设计可能是将ApplicationLauncher
作为接口并创建生产和测试实现(或者只是模拟测试实现)。您需要将ApplicationLauncher
的实例传递到RunApp
类,可能在构造函数中。
答案 1 :(得分:2)
您可以使用PowerMock模拟静态方法,但是您应该检查是否真的需要静态方法调用。
答案 2 :(得分:2)
您可以重构您的课程以接受启动器“注入”。
public class RunApp
{
public void check(String name)
{
check(name, Application.getLauncher("launch"));
}
protected check(String name, ApplicationLauncher launcher) {
if (name != null)
{
String appName = name + ".bat";
launcher.launch(appName);
}
}
}
这样你可以使用新的受包受保护的check()方法来使用假启动器测试你的代码。