【问题标题】:JUnit: How to check if a method calls another method?JUnit:如何检查一个方法是否调用另一个方法?
【发布时间】:2013-08-02 07:22:12
【问题描述】:

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


    }
}

但是,它说我不能使用验证方法

【问题讨论】:

    标签: java junit mockito stub verify


    【解决方案1】:

    我假设 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 spy 来验证您的控制器:

    verify(regcontroller).errorUsernameDuplicate()
    

    显然该方法本身未经测试,但它是微不足道的并且不是问题。

    【讨论】:

      猜你喜欢
      • 2016-11-16
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      相关资源
      最近更新 更多