我在名为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
类的构造函数即可。但是您确实需要模拟作为参数传入的Context
和CallListener
类。您需要模拟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语句块中调用这些方法。