使用 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);}
我觉得这更容易理解和编写(我个人的喜好)
我正在尝试使用 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);}
我觉得这更容易理解和编写(我个人的喜好)