首页 > 解决方案 > 保存方法的单元测试失败,错误指向 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。

标签: javaunit-testingfilechooser

解决方案


在 FileChooser.java 的源代码中,似乎处理了该方法的空参数:

private List<File> showDialog(final Window ownerWindow,
                                  final FileChooserType fileChooserType) {
        FileChooserResult result = Toolkit.getToolkit().showFileChooser(
                (ownerWindow != null) ? ownerWindow.getPeer() : null,
    .......................................................................

所以我认为问题出在其他地方。

来源:https ://github.com/javafxports/openjdk-jfx/blob/4f0addff16de7182752bc60541f44baeb0e99d2a/modules/javafx.graphics/src/main/java/javafx/stage/FileChooser.java#L411


推荐阅读