2013-03-24 54 views
1

我是新来的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")); 

} 

它的工作原理,但在测试运行过程中,我需要每次点击弹出对话框。

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

回答

2

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

0

重写您的validate方法并将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类,在您的测试中,您只需使用一个虚拟类。但是,如果仅仅是为了显示一个对话框,这可能是矫枉过正的。

+0

你的答案看起来很有希望,但是我仍然不知道如何在测试中覆盖'showCannotBeEmptyDialog()'方法?这是用户交互进行单元测试的最佳做法吗? – mko 2013-03-24 19:00:45

+0

@yozloy不用测试该类的实例,而是使用该方法重写测试扩展。不确定它是否是“最佳实践”,但我已经多次使用它,并且更喜欢它在我看到的“Robot”和“doClick”解决方案中 – Robin 2013-03-24 19:45:11