Java 如何在swing弹出对话框中模拟按钮单击?

Java 如何在swing弹出对话框中模拟按钮单击?,java,swing,junit,Java,Swing,Junit,我是Java新手,我想为名称验证类编写JUnit测试 我想测试以下代码: public boolean createNewUMLClassFromString(String className) { if(validate(className)){ .... } return false; } private boolean validate(String userInput){ /* check if it's empty */

我是Java新手,我想为名称验证类编写JUnit测试

我想测试以下代码:

public boolean createNewUMLClassFromString(String className) {
    if(validate(className)){
              ....
    }
    return false;
}

private boolean validate(String userInput){
    /* check if it's empty  */
    if (userInput.equals("")){  
                    JOptionPane.showMessageDialog(null, "Class Name can't be empty");
        return false;
    }
            return true;
}
所以我写了一篇JUnit

public void emptyStringCheckerTest(){
    assertFalse("new class can not be empty", um.createNewUMLClassFromString("do"));

}
它可以工作,但是在测试运行过程中,我每次都需要单击弹出对话框


那么,是否有人可以告诉我如何在测试过程中模拟按钮点击,或者有更好的方法编写测试?谢谢?

要执行编程按钮单击,只需调用doClick方法。不过,我不知道如何将其插入测试过程。

要执行编程按钮单击,只需调用doClick方法。不过,我不知道如何将其插入到您的测试过程中。

看看java.awt.Robot,以及像abbot这样增强它的库。

看看java.awt.Robot,在像abbot这样的库中,可以增强它。

重写您的验证方法,并将JOptionPane调用移动到一个单独的方法,您可以在单元测试中替换它,例如包可见方法

private boolean validate(String userInput){
    /* check if it's empty  */
    if (userInput.equals("")){  
        showCannotBeEmptyDialog();            
        return false;
    }
            return true;
}

void showCannotBeEmptyDialog(){
  JOptionPane.showMessageDialog(null, "Class Name can't be empty");
}
使它包可见仍然允许您在测试中覆盖它,例如不显示UI,并且您仍然能够断言是否实际调用了该方法

另一个选项是将实例作为构造函数参数传递,该参数负责向用户显示消息。在您的生产代码中,此实例将使用JOptionPane类,在测试中,您只需使用一个虚拟对象。但是,如果只是为了显示一个对话框,这可能会有些过分。

重写您的验证方法,并将JOptionPane调用移动到一个单独的方法,您可以在单元测试中替换该方法,例如包可见方法

private boolean validate(String userInput){
    /* check if it's empty  */
    if (userInput.equals("")){  
        showCannotBeEmptyDialog();            
        return false;
    }
            return true;
}

void showCannotBeEmptyDialog(){
  JOptionPane.showMessageDialog(null, "Class Name can't be empty");
}
使它包可见仍然允许您在测试中覆盖它,例如不显示UI,并且您仍然能够断言是否实际调用了该方法


另一个选项是将实例作为构造函数参数传递,该参数负责向用户显示消息。在您的生产代码中,此实例将使用JOptionPane类,在测试中,您只需使用一个虚拟对象。但是,如果只是为了显示一个对话框,这可能有些过分。

您的答案似乎很有希望,但我仍然不知道如何在测试中覆盖showCannotBeEmptyDialog方法?这是使用用户交互进行单元测试的最佳实践吗?@yozloy不是测试该类的实例,而是测试覆盖该方法的扩展。不确定这是否是一个最佳实践,但我已经使用过很多次了,我更喜欢它,而不是我在这里看到的Robot和doClick解决方案。你的答案似乎很有希望,但我仍然不知道如何在测试中覆盖showCannotBeEmptyDialog方法?这是使用用户交互进行单元测试的最佳实践吗?@yozloy不是测试该类的实例,而是测试覆盖该方法的扩展。我不确定这是否是一个最佳实践,但我已经使用过很多次了,比起我在这里看到的Robot和doClick解决方案,我更喜欢它