如何验证是否调用了给定类的特定构造函数?

时间:2015-09-15 09:06:07

标签: java unit-testing junit testng jmockit

假设以下是被测试的课程:

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。

2 个答案:

答案 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();
}

(很遗憾,我目前无法对此进行测试)