使用JUnit / JMockit测试文件选择

时间:2017-01-17 20:36:07

标签: java junit jmockit

我正在尝试使用JUnit和JMockit测试返回File对象的方法。我是这两个人的初学者。

我遇到的问题是我无法弄清楚如何正确/成功地模拟返回文件的实现方法,因为实际上,用户必须实际选择要返回的方法的文件。我一直遇到的错误是:

java.lang.IllegalStateException: Missing invocation to mocked type at this point; please make sure such invocations appear only after the declaration of a suitable mock field or parameter

有什么建议吗?

这是我实现的重新设计:

public final class MyClass {
    public static File OpenFile(Stage stage, String title, String fileTypeText, ArrayList<String> fileType) throws Exception {
        File file = null;
        try {
            FileChooser fileChooser = new FileChooser();
            fileChooser.setTitle(title);
            FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionsFilter(fileTypeText + fileType, fileType);
            fileChooser.getExtensionsFilters().add(extFilter);
            file = fileChooser.showOpenDialog(stage);
            return file;
        }
        catc (Exception e) {
            if(fileType==null) {
                ...
            }
            return file;
        }
    }
}

这是我尝试过的JUnit测试的重新设计:

@Test
public void TestOpenFile(@Mocked Stage stage) throws Exception {

    final ArrayList<String> extensions = new ArrayList<String>();
    extensions.add(".txt");

    final File file = null;

    new Expectations() {{
        MyClass.OpenFile(stage, anyString, anyString, extensions); returns(file);
    }};

    assertEquals(file, MyClass.OpenFile(stage, "some title", "some type", extensions));

}

2 个答案:

答案 0 :(得分:1)

你的解决方案是正确的,但我会用预期代替:

public void TestOpenFile(@Mocked FileChooser chooser) throws Exception{

    new Expectations() {
        {
            chooser.showOpenDialog(stage); result = expectedFile;
         }};


final File actualFile = MyClass.OpenFile(...);

assertEquals(expectedFile, actualFile);}

我发现这更容易理解和写作(我个人的偏好)

答案 1 :(得分:0)

我意识到我最初没有正确地解决问题。我为解决这个问题所做的是:

模拟FileChooser.showOpenDialog方法返回一个文件,而不是试图模拟我自己的方法来返回一个文件,这会破坏测试的目的。

    final File expectedFile = new File("abc");

    new MockUp<FileChooser>() {

        @Mock
        File showOpenDialog(final Window overWindow) {
            return expectedFile;
        }
    };

    final File actualFile = MyClass.OpenFile(...);

    assertEquals(expectedFile, actualFile);