JUnit:如何检查一个方法是否调用了另一个方法



我想检查另一个方法中的一个方法是否被调用。如果另一方法返回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())

    }
}

然而,它说我不能使用验证方法

我假设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()

显然,该方法本身未经测试,但它很琐碎,也不是问题。

相关内容

  • 没有找到相关文章

最新更新