如何使用 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?
我正在使用 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?