使用 assertJ 命令 (TestNG + assertJ Swing) 调用时,swing 应用程序会立即打开和关闭

Posted

技术标签:

【中文标题】使用 assertJ 命令 (TestNG + assertJ Swing) 调用时,swing 应用程序会立即打开和关闭【英文标题】:swing application opens and closes down immediately when invoked with assertJ command (TestNG + assertJ 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);
     

【问题讨论】:

【参考方案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");
//...
        );
    

【讨论】:

以上是关于使用 assertJ 命令 (TestNG + assertJ Swing) 调用时,swing 应用程序会立即打开和关闭的主要内容,如果未能解决你的问题,请参考以下文章

流式断言器AssertJ介绍

junit和assertj的区别

单元测试断言利器 AssertJ

从命令提示符运行testng.xml。我有从Maven Project创建的jar。 Surefireplugin并没有解决我的目的

断言AssertJ使用方式

AssertJ摘要