这是我想要测试的代码:
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,只会返回check,这是真的。
然而,如果我输入了一个无效的用户名,比如"(这只是空格),那么它应该返回false,但由于GUI启动,它不会返回。
我怎么能阻止它启动GUI并完成方法呢?我原以为mockito可能会派上用场,但我只学习了它的理论,从未真正实现过它!
提前感谢!
您应该在代码中注入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-to-mock方法调用。