0

我想编写一个测试用例来验证我班级中的一个方法。我的方法中有一个必须模拟的本地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);

因为getLauncherApplication类中的静态方法。我该如何解决这个问题?

4

3 回答 3

3

更好的应用程序设计可能是ApplicationLauncher作为接口并创建生产和测试实现(或只是模拟测试实现)。您可能需要将一个实例传递ApplicationLauncher给您的RunApp类,也许是在构造函数中。

于 2012-12-05T08:27:29.987 回答
2

您可以使用PowerMock模拟静态方法,但是您应该检查静态方法调用是否真的有必要。

于 2012-12-05T08:13:04.880 回答
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() 方法来测试你的代码,使用一个假的启动器。

于 2012-12-07T13:32:11.147 回答