在一个类中使用Mockito Spy调用另一个类的静态方法

8
尝试在我的JUnit测试中使用Mockito的spy功能。我最初有一个类:
public class App1 { 
    public String method1() {
        sayHello();
    }

    public sayHello() {
        Systems.out.println("Hello");
    }
}

在我测试类中,使用mockito spy对上述类进行了正确的操作:

@Test(expected = IOException.class)
public void testMethod1Failure(){   
    App1 a1 = spy(App1);
    doThrow(IOException.class).when(a1).sayHello();

    a1.method1();
}

但是之后,我不得不重新调整代码,并将sayHello()方法放到另一个类中,作为静态方法使用:

public class App1 { 
    public String method1() {
        App2.sayHello();
    }
}

public class App2 { 
    public static void sayHello() {
        Systems.out.println("Hello");
    }
}

在这个改变后,我的原始JUnit测试用例出现了问题,我不确定如何使用Mockito spy来启动调用外部App2静态方法的App1...有人知道我该怎么做吗?提前感谢。

1个回答

7

Mockito不支持模拟静态代码。以下是处理它的一些方法:

  • 使用PowerMockito或类似框架,如此处建议:用Mockito模拟静态方法
  • 重构您的代码,将静态方法转换为实例方法。正如您所发现的那样,静态方法不易进行单元测试。
  • 如果执行实际静态方法的成本很低,那么只需调用它即可。

2
从Mockito v3.4.0开始,您可以在不使用PowerMockito的情况下模拟静态方法。例如,请参见https://www.baeldung.com/mockito-mock-static-methods - JohnK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接