Java 如何在swing弹出对话框中模拟按钮单击?
我是Java新手,我想为名称验证类编写JUnit测试 我想测试以下代码: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 */
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解决方案,我更喜欢它