模拟静态方法

时间:2012-12-05 08:02:35

标签: java junit mockito jmock

我想编写一个测试用例来验证我班级中的方法。 我的方法中有一个本地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类中的静态方法。我该如何解决这个问题?

3 个答案:

答案 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()方法来使用假启动器测试你的代码。