我如何使用Junit测试这个简单的方法?

时间:2013-08-03 12:22:56

标签: java testing junit mockito

这是我要测试的代码:

public class ValidateRegisterInputController {

    public boolean validateInputHandle(UserDataObject user1){
    ValidateInput validateinput = new ValidateInput();
    boolean check = true;

    if (!validateinput.validateUsername(user1.getUsername())) {
        check = false;
        BanUserGUI bangui = new BanUserGUI();
        bangui.displayBanGUI();
    }

    return check;
   }

当我尝试运行测试时,它会启动“bangui.displayBanGUI()”方法并转到控制台请求输入,这意味着测试从未正确完成运行。这是我到目前为止的测试:

public class ValidateRegisterInputControllerTest {

    @Test
    public void testValidateRegisterInputControllervalidateInputHandleReturnsStringvalidWhenValidInputIsMade(){
    UserDataObject user1 = new UserDataObject(" ", "password1", "John", "Smith", 1);
    ValidateRegisterInputController controller = new ValidateRegisterInputController();

    assertTrue(controller.validateInputHandle(user1));

    }

}

所以基本上,如果我输入一个有效的用户名(例如,“John”),这个测试将会通过,因为它不会显示GUI,只会返回检查,这是真的。

但是,如果我输入一个无效的用户名“”(这只是空格),那么它应该返回false,但是由于GUI启动而不会。

如何停止启动GUI并关闭方法。我以为mockito可能会派上用场,但我只是为它学习了理论,并且从未真正实现它!

提前致谢!

1 个答案:

答案 0 :(得分:2)

您应该在代码中注入BanUserGUI构造。使用javax.inject.Provider。或者你应该提取方法:

public class ValidateRegisterInputController {

    public boolean validateInputHandle(UserDataObject user1){
    ValidateInput validateinput = new ValidateInput();
    boolean check = true;

    if (!validateinput.validateUsername(user1.getUsername())) {
        check = false;
        BanUserGUI bangui = createBanUserGui();
        bangui.displayBanGUI();
    }

    return check;
   }

   BanUserGUI createBanUserGui()
   {
     return new BanUserGUI();
   }
}

之后你可以简单地覆盖单元测试中的方法来返回mock,或者使用spy来模拟方法调用。