java - 如何使用 Mockito 验证对接口(interface)的调用?

标签 java android tdd mockito robolectric

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

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

这是我的测试课

@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 中使用 TDD 和 robolectric,所以如果我不能解决它,我就不能继续工作,谢谢!

最佳答案

您迷失在模拟的迷宫中。

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

即使您在调用 goToLogin() 时指示您的 mock 做某事,此时您不再测试您的代码,您只是在测试您自己的 mock 设置,旋转在圈子里。

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

关于java - 如何使用 Mockito 验证对接口(interface)的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30921709/

相关文章:

java - Android:如何处理按钮点击

asp.net-mvc - HttpFileCollectionBase : Mocking Count-Property

iphone - 测试 IBOutlet 自动连接或在未连接的 socket 上构建失败

unit-testing - 单元测试成为 TDD 的集成测试

java - 将值传递给注释

java - 如何比较2个List<Entity>?

java - 有哪些适用于 Android 的 websocket 客户端?

java - 使用 Intent 传递整数在 Android 中不起作用

java - 安卓 : ArrayList with Bitmap from assets

java - Android从常量xml读取值