2

別のメソッド内のメソッドが呼び出されるかどうかを確認したい (別のメソッドが 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())


    }
}

ただし、検証メソッドを使用できないと表示されます

4

1 に答える 1

3

RegisterGUI はクラス名であると想定しているため、メソッドは静的です。明らかに、Java では静的メソッドをオーバーライドすることは不可能であるため、mockito で行うことはできません。コードをリファクタリングし、静的メソッドを使用しないことをお勧めします。

ただし、レガシー コードを扱っている場合は、バイトコードを操作して静的をオーバーライドする Powermock を使用できます。

レガシ コードを操作するもう 1 つの方法は、静的メソッド呼び出しを新しいメソッドに抽出することです。したがって、コントローラーは次のようになります。

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()

明らかに、メソッド自体はテストされていませんが、それは些細なことであり、問​​題ではありません。

于 2013-08-01T11:42:22.700 に答える