在一个类中使用Mockito间谍从另一个类调用静态方法

时间:2017-04-04 00:14:51

标签: java junit mocking mockito

尝试将Mockito的间谍功能用于我的JUnit测试。我最初有一个班级:

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

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

我的测试类中的所有内容都与上面的类中的mockito间谍一起正常工作:

@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间谍启动调用外部App2静态方法的App1 ...有谁知道我怎么做?提前致谢

1 个答案:

答案 0 :(得分:2)

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

  • 使用PowerMockito或此处建议的类似框架:Mocking static methods with Mockito
  • 重构您的代码,将静态方法转换回实例方法。正如您所发现静态方法不容易进行单元测试。
  • 如果执行有问题的实际静态方法成本低廉,那么只需调用它即可。