假设以下是被测试的课程:
public class MyClass {
public void doSomething() throws FileNotFoundException {
FileInputStream fis = new FileInputStream( "someFile.txt" );
// .. do something about fis
}
}
如果使用jMockit使用参数FileInputStream( String )
调用方法doSomething()
,如何验证是否调用构造函数"someFile.txt"
?
我不是在寻找手动或非自动化的答案。我正在寻找一个答案,它使用JUnit或TestNG等工具进行自动化单元测试,借助于模拟和间谍工具,最好是jMockit。
答案 0 :(得分:3)
使用JMockit Expectations API,测试可以像方法调用一样验证构造函数调用。测试只需要将类指定为@Mocked
。例如:
@Test
public void exampleTestThatVerifiesConstructorCall(@Mocked FileInputStream anyFIS)
{
new MyClass().doSomething();
new Verifications() {{ new FileInputStream("someFile.txt"); }};
}
那就是说,我建议避免模仿像FileInputStream
这样的低级类,这通常只是被测试类的内部实现细节。更好的测试将使用实际文件并检查它是否按预期读取。
答案 1 :(得分:1)
您可以使用JMockit的$init
来验证构造函数调用:
@Test
void testDoSomethingCallsConstructorWithStringArgument throws FileNotFoundException() {
new MockUp<FileInputStream>() {
@Mock(invocations = 1) // Verifies one call
void $init(String file) {
assertEquals("someFile.txt", file);
}
};
// TODO Setup an object of MyClass
myObject.doSomething();
}
(很遗憾,我目前无法对此进行测试)