我想检查另一个方法中的方法是否被调用(如果另一个方法返回false!)
这听起来有点复杂,但如果我提供我的代码,它应该更容易理解。
有人知道这是否可行?
我想在usermanagement.storeUser(user1)返回false时检查以下方法是否调用RegisterGUI.errorDuplicateUsername()。
public class RegisterController {
public void regHandle(UserDataObject user1){
ValidateRegisterInputController validate = new ValidateRegisterInputController();
validate.validateInputHandle(user1);
OracleUserManagement usermanagement = OracleUserManagement.getInstance();
if (usermanagement.storeUser(user1) == false) {
RegisterGUI.errorUsernameDuplicate(); }
}
}
这就是我到目前为止:
/** Step1. Mock UserDataObject and stub OracleUserManagement.storeUser(UserDataObject) to return false.
* Step2. Check if RegisterController.regHandle(MockedUserDataObject) calls RegisterGUI.errorDuplicateUsername
* Step3. See if Test passes!
*/
@Test
public void testRegisterControllerregHandleCallsLoginGUIerrorDuplicateUsernameWhenOracleUserManagementstoreUserReturnsFalse(){
UserDataObject user1mocked = mock(UserDataObject.class);
OracleUserManagement usermanagementmocked = mock(OracleUserManagement.class);
when(usermanagementmocked.storeUser(user1mocked)).thenReturn(false);
/** This is where I'm a bit confused. How can I test that when I run this
* method, it will call RegisterGUI.errorDuplicateUsername()?
*/
RegisterController regcontroller = new RegisterController();
regcontroller.regHandle(user1mocked);
verify(RegisterGUI.errorUsernameDuplicate())
}
}
但是,它说我不能使用验证方法
答案 0 :(得分:3)
我假设RegisterGUI是一个类名,因此该方法是静态的。显然在Java中,不可能覆盖静态方法,所以你不能用mockito来做。我建议使用重构代码,不要使用静态方法。
但是,如果您正在处理遗留代码,则可以使用Powermock来操作字节码并覆盖静态代码。
使用遗留代码的另一种方法是将静态方法调用提取到新方法中。所以你的控制器将是:
public class RegisterController {
public void regHandle(UserDataObject user1){
ValidateRegisterInputController validate = new ValidateRegisterInputController();
validate.validateInputHandle(user1);
OracleUserManagement usermanagement = OracleUserManagement.getInstance();
if (usermanagement.storeUser(user1) == false) {
errorUsernameDuplicate(); }
}
void errorUsernameDuplicate() {
RegisterGUI.errorUsernameDuplicate();
}
}
现在你可以使用mockito间谍来验证你的控制器:
verify(regcontroller).errorUsernameDuplicate()
显然,该方法本身未经测试,但它很简单,并不是问题。