使用Mocktio从方法内部验证startActivity和callBackListener



我在名为CommunicationManager

public void makeCall(Context context, String number, CallListener communicationCallListener) {
final PackageManager packageManager = context.getPackageManager();
if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
final Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(SCHEME_TYPE_TEL + number));
context.startActivity(intent);
if (communicationCallListener != null) {
communicationCallListener.phoneClickCallBackListener();
}
}
}

通过示例,我了解到,我可以对调用内部方法的源使用mock,在我的情况下,它是activityStart调用和callBack侦听器,在同一位置触发。

到目前为止,我能做的如下所示,但我对的一些事情有点困惑

@Test
public void test_makeCall() {
String dummyNumber = "+xxx-xxx-xxxx";
final Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + dummyNumber));
communicationManager.makeCall(mockContext, dummyNumber, callListener);
verify(communicationManager).makeCall(mockContext, dummyNumber, callListener);
mockContext.startActivity(intent);
verify(mockContext, times(1)).startActivity(intent);
callListener.phoneClickCallBackListener();
verify(callListener, times(1)).phoneClickCallBackListener();
}

1-在我的测试方法中,startActivity方法被调用,但如果它来自我试图测试的方法,我没有引用。2-callBack侦听器也是如此3-我应该嘲笑我正在编写测试用例的班级吗?在我的情况下是CommunicationManager

我认为您不需要模拟CommunicationManager类,只要可以安全地调用Intent类的构造函数即可。但是您确实需要模拟作为参数传入的ContextCallListener类。您需要模拟PackageManager,并将对packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)的响应模拟为true或false。如果此方法不返回true,则测试将永远不会访问If语句中的块。您还必须注入"PackageManager"mock作为context.getPackageManager()的返回值。

在测试中,在以下几行中,您调用方法,然后验证您是否调用了方法。因此,第一个和第二个问题的答案是否定的,它们不是从测试方法内部调用的。这并没有增加多少价值。

mockContext.startActivity(intent);
verify(mockContext, times(1)).startActivity(intent);
callListener.phoneClickCallBackListener();
verify(callListener, times(1)).phoneClickCallBackListener();

如果从测试的该部分删除行callListener.phoneClickCallBackListener();mockContext.startActivity(intent);,那么测试应该会失败,直到模拟packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)返回true,并且在If语句块中调用这些方法。

相关内容

  • 没有找到相关文章

最新更新