我正在尝试使用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));
}
答案 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);