java - 保存方法的单元测试失败,错误指向 fc.showSaveDialog(null)
问题描述
根据我的标题
fc.showSaveDialog(null)
我对 save 方法的单元测试失败并指向该语句的行。
我意识到它可能会失败,因为我将它设置为 null 而不是一个阶段,但我也想了解为什么在这种情况下它不能为 null。
public static void save(String text) throws IOException {
FileChooser fc = new FileChooser();
//Start file chooser in project directory
String currentPath = Paths.get(".").toAbsolutePath().normalize().toString();
fc.setInitialDirectory(new File(currentPath));
// Define extension filters
FileChooser.ExtensionFilter txtFilter = new FileChooser.ExtensionFilter("Text Files (*.txt)", "*.txt");
FileChooser.ExtensionFilter pdfFilter = new FileChooser.ExtensionFilter("PDF Files (*.pdf)", "*.pdf");
fc.getExtensionFilters().addAll(txtFilter, pdfFilter);
//////////////////////////////THIS LINE
File file = fc.showSaveDialog(null);
///////////////////////////////////////
if (file != null) {
FileChooser.ExtensionFilter selectedFilter = fc.getSelectedExtensionFilter();
if (selectedFilter == txtFilter) {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(text);
writer.close();
} else if (selectedFilter == pdfFilter) {
savePdf(text, file);
}
}
}
这是我的单元测试。按键模拟意味着当文件选择器弹出时只输入 A ,但我的测试在失败之前并没有做到那么远。
@Test
void testSave() throws IOException {
String text = "hello world";
FileFunctions.save(text);
Robot robot;
try {
robot = new Robot();
// Simulate a key press
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
如有必要,我可以添加整个故障跟踪,但主要部分是
java.lang.IllegalStateException:这个操作只允许在事件线程上进行;currentThread = main at com.sun.glass.ui.Application.checkEventThread(Application.java:443) at com.sun.glass.ui.CommonDialogs$ExtensionFilter.(CommonDialogs.java:75) at com.sun.javafx.tk .quantum.QuantumToolkit.convertExtensionFilters(QuantumToolkit.java:1614) at com.sun.javafx.tk.quantum.QuantumToolkit.showFileChooser(QuantumToolkit.java:1557) at javafx.stage.FileChooser.showDialog(FileChooser.java:416) at javafx.stage.FileChooser.showSaveDialog(FileChooser.java:392) at assignment1.FileFunctions.save(FileFunctions.java:87) at assignment1.unitTests.testSave(unitTests.java:18) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法)在 sun.reflect.NativeMethodAccessorImpl。
解决方案
在 FileChooser.java 的源代码中,似乎处理了该方法的空参数:
private List<File> showDialog(final Window ownerWindow,
final FileChooserType fileChooserType) {
FileChooserResult result = Toolkit.getToolkit().showFileChooser(
(ownerWindow != null) ? ownerWindow.getPeer() : null,
.......................................................................
所以我认为问题出在其他地方。
推荐阅读
- lua - 如何将一个函数传递给 Lua 中的另一个函数?
- scheduled-tasks - 雪花任务正在运行,调用过程时没有影响数据
- python-3.x - 使用 pikepdf 从 pdf 中提取图像
- php - 在 MySQL 中显示除少数记录外的所有记录
- r - R 包 biomaRt 和此依赖项 RSQLite 出错
- java - 如何将通知访问屏幕过滤到我的应用程序?
- c# - 未处理的异常。System.ArgumentNullException:值不能为空。(参数“名称或连接字符串”)
- rust - 循环文件,索引字符
- java - 当我使用导航组件时,在启动片段之前显示 3 秒的空白屏幕?
- css - Bootstrap 5 + Masonry-Layout JS 边距