使用 JUnit/JMockit 测试文件选择

Test File Selection with JUnit/JMockit

我正在尝试使用 JUnit 和 JMockit 测试 returns 文件对象的方法。我是这两个的初学者。

我遇到的问题是我不知道如何 properly/successfully 模拟文件的实现方法 return,因为实际上,用户必须 select 方法的文件 return。我保留 运行 的错误是:

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));

}

我意识到一开始我处理问题的方式不正确。我为解决这个问题所做的是:

将 FileChooser.showOpenDialog 方法模拟到 return 一个文件,而不是尝试将我自己的方法模拟到 return 一个文件,这会破坏测试的目的。

    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);

您的解决方案是正确的,但我会改用期望值:

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

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


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

assertEquals(expectedFile, actualFile);}

我觉得这更容易理解和编写(我个人的喜好)