如何使用 Mockito 验证对接口的调用?

How verify the call to an interface with Mockito?

我正在使用 mockito 来测试对接口的调用,但是当我想验证调用 'goToLogin()' 时接口方法 'goToLoginInterface()' 是否被连续调用时,我遇到了一些问题。它应该是一些简单的东西,但我一直在努力寻找解决方案几个小时。 我使用 assert 来验证 'getActivityParent()' 是否有效地返回了模拟接口对象,确实如此!所以我不知道问题出在哪里。

public class LoginSimpleFragment extends Fragment {

    private ActivityInterface mParentActivity;

    public interface ActivityInterface {
        void goToLoginInterface();
    }

    public ActivityInterface getActivityInterface(){
        return mParentActivity;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.login_simple, container, false);
    }

    public void goToLogin() {
        getActivityInterface().goToLoginInterface();
    }
}

这是我的测试class

@Config(manifest = "../app/src/main/AndroidManifest.xml", emulateSdk = 18)
@RunWith(RobolectricTestRunner.class)  // <== REQUIRED for Robolectric!
public class TestLoginActivity {

    @Test
    public void testPositiveButtonAction() throws Exception {
        LoginSimpleFragment mockLoginSampleFragment =
                mock(LoginSimpleFragment.class);
        LoginSimpleFragment.ActivityInterface mockInterface =
                mock(LoginSimpleFragment.ActivityInterface.class);
        Mockito.doNothing().when(mockInterface).goToLoginInterface();

        //doReturn(mockInterface).when(mockLoginSampleFragment).getActivityInterface();
        when(mockLoginSampleFragment.getActivityInterface()).thenReturn(mockInterface);
        mockLoginSampleFragment.goToLogin();

        assert( Mockito.mockingDetails(mockLoginSampleFragment.getActivityInterface()).isMock() );
        verify(mockInterface).goToLoginInterface();
    }

}

输出测试说:

Wanted but not invoked:
activityInterface.goToLoginInterface();
-> at co.mobico.mainactivities.TestLoginActivity.testPositiveButtonAction(TestLoginActivity.java:35)
Actually, there were zero interactions with this mock.

TestLoginActivity.java:35 是行 'verify(mockInterface).goToLoginInterface()',在测试函数

的末尾

你能帮我通过测试吗?,我在 Android 和 robolectric 中使用 TDD,所以如果我不能解决它,我就不能继续工作,谢谢!

您迷失在模拟的迷宫中。

您实际上并没有使用 LoginSampleFragment,您使用的是 class 的 Mock。因此,当您调用 goToLogin() 时,什么也不会发生,因为模拟不会 运行 您的正常 class 代码。

即使您在调用 goToLogin() 时指示您的 mock 执行某些操作,此时您也不再测试您的代码,您只是在测试您自己的 mock 设置,在原地打转。

这可能是一本不错的读物:When should I mock?