一段代码是这样的:
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()
移动到另一个方法并构建一个子类,然后重写该方法。这个改动在不考虑测试的情况下也是合理的,所以我认为是可以接受的。但仅添加用于测试的标志是 Not Acceptable 。
但我不能这样做,因为我需要测试的方法是静态的。
是否有其他方法可以在不运行 A a = new A()
行的情况下测试这段代码?
最佳答案
如果您不希望该方法引入状态,请使用 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
将允许您设置在执行静态方法后最终返回的内容。
关于java - 如何在不运行静态方法中的代码的情况下测试静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22549619/