如何在不运行代码的情况下测试静态方法

时间:2014-03-21 03:33:37

标签: java unit-testing junit

一段代码是这样的:

public class ClassToTest {
    public static A method1(arguments here){
        //a log of code here
        A a = new A();
        return a;
    }
}

问题是构造函数调用new A()在库中,我不希望method1在我的测试中调用此构造函数,因为它不是我当前测试所必需的,它包含一些网络连接。我希望我的单元测试摆脱任何外部依赖。

通常在单元测试中,我们不想对源代码进行任何修改。但是为了测试方法1中的关键逻辑,可以对源代码进行一些合理的更改。

首先,我想我可以将new A()移动到另一个方法并构建一个子类,然后重写该方法。这种变化也是合理的,不考虑测试,所以我认为这是可以接受的。但是,仅为测试添加标志是不可接受的。

但是我不能这样做,因为我需要测试的方法是静态的。

有没有其他方法可以在不运行第A a = new A()行的情况下测试这段代码?

1 个答案:

答案 0 :(得分:3)

如果您不希望该方法引入状态,请使用PowerMockito.mockStatic()来模拟返回值。这假设您的静态方法没有副作用,如果没有,您真的应该写它,以便它不会。

@RunWith(PowerMockRunner.class)
public class ClassToTestTest {
    private ClassToTest classMock;
    private ClassToTest testObject;
    @Before
    public void init() {
        testObject = new ClassToTest();
    }

    @Test
    public void example() {
        Object args = new Object();
        PowerMockito.mockStatic(ClassToTest.class);
        doReturn(new A()).when(ClassToTest.class, "method1", args);
   }
}

doReturn将允许您设置在执行静态方法后最终会返回的内容。