java - JUnit:如何检查一个方法是否调用另一个方法?

标签 java junit mockito stub verify

我想检查另一个方法中的方法是否被调用(如果另一个方法返回 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 来操作字节码并覆盖静态。

处理遗留代码的另一种方法是将静态方法调用提取到新方法中。所以你的 Controller 将是:

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 来验证您的 Controller :

verify(regcontroller).errorUsernameDuplicate()

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

关于java - JUnit:如何检查一个方法是否调用另一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17992887/

相关文章:

java - jsoup 传输了多少字节

java - 如何在 Netbeans 8.0 中运行单元测试而不下载 Maven 依赖项?

java - 如何在 junit 中使用未捕获的异常处理程序进行多线程测试?

android - 如何从 Activity 中获取菜单引用

java - 使用 wiremock 时连接被拒绝

java - 使用 Java 进行 SQL 插入

java - 无法将 String 类型的值转换为 MethodSecurityMetadataSource (Spring 3.1)

java - Mockito - 注入(inject)模拟列表

java - 不同的线程获得相同的实体并且彼此看不到变化

java - Mockito 模拟服务类