我正在使用 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/