一段代码是这样的:
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()
行的情况下测试这段代码?
答案 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
将允许您设置在执行静态方法后最终会返回的内容。