【问题标题】:swing application opens and closes down immediately when invoked with assertJ command (TestNG + assertJ Swing)使用 assertJ 命令 (TestNG + assertJ Swing) 调用时,swing 应用程序会立即打开和关闭
【发布时间】:2018-03-27 08:54:43
【问题描述】:

尝试将 assertJ-swing 用于基于 java-swing 的应用程序的 UI 测试。

情况:JavaApp.java 中的示例应用程序(带有 Main 类)在从该 java 文件调用时工作正常(作为 Java 应用程序运行)。但是当它从 TestNG 中使用 assertj-swing 的命令调用时:

application(JavaApp.class).start(); 

应用程序打开但立即关闭。

问题:这是唯一的方法吗?请提出解决方案或任何其他方法来启动应用程序并使其保持打开状态,以便执行进一步的操作。

Java应用程序:

package jdialogdemo;

import java.awt.*;
import java.awt.event.*;

import javax.lang.model.util.SimpleElementVisitor6;
import javax.swing.*;

public class JavaApp {
    public static void main(String[] args) throws Exception {
        final JFrame frame = new JFrame("JDialog Demo");
        final JButton btnLogin = new JButton("Click to login");

        btnLogin.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent e) {
                        LoginDialog loginDlg = new LoginDialog(frame);
                        loginDlg.setVisible(true);
                        // if logon successfully
                        if(loginDlg.isSucceeded()){
                            btnLogin.setText("Hi " + loginDlg.getUsername() + "!");
                        }
                    }
                });

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(700, 200);
        frame.setLocationRelativeTo(null);
        frame.setLayout(new FlowLayout());
        frame.getContentPane().add(btnLogin);
        frame.setVisible(true);
     }
}

【问题讨论】:

    标签: swing user-interface ui-testing gui-testing assertj


    【解决方案1】:

    AssertJ-Swing 验证您仅访问 EDT 上的 swing 组件(根据需要,因为 Swing 不是线程安全的,请参阅 Concurrency in Swing - Initial threads)。

    您的 main 方法违反了这一点(通过从主线程构造 UI),因此 AssertJ-Swing 失败并出现异常。

    要纠正问题,您的主要方法应如下所示:

    public class JavaApp {
        public static void main(String[] args) throws Exception {
            SwingUtilities.invokeLater(() -> {
                final JFrame frame = new JFrame("JDialog Demo");
                final JButton btnLogin = new JButton("Click to login");
    //...
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多