我上了这样的课,
class MyIntentProvider {
public Intent provideIntent(final Context context) {
final Intent intent = new Intent();
intent.setAction(MY_ACTION);
final List<ResolveInfo> matchedServices = context.getPackageManager().queryIntentServices(intent, 0);
if(matchedServices.size() == 1) {
String packageName = info.serviceInfo.packageName;
String serviceName = info.serviceInfo.name;
intent.setComponent(new ComponentName(packageName, serviceName));
}
return intent;
}
}
我的测试班级是这样的
class MyIntentProviderTest {
@Mock
private Context mContext;
@Mock
private PackageManager mockPackageManager;
@Mock
private Intent mockIntent;
@Mock
private ResolveInfo resolveInfo;
private List<ResolveInfo> mockResolvedInfoList;
@Before
public void setup() {
myIntentProvider = new MyIntentProvider();
mockResolvedInfoList = new ArrayList<ResolveInfo>();
mockResolvedInfoList.add(new ResolveInfo());
}
@Test
public void provideIntent() {
//setup
mContext = spy(RuntimeEnvironment.application);
doReturn(mockResolvedInfoList).when(mockPackageManager).queryIntentServices(any(Intent.class), anyInt());
//test
final Intent intent = myIntentProvider.provideBindingIntent(mContext);
//verify
assertNotNull(intent.getComponent());
}
}
但是matchedServices
的大小总是返回0。如何模拟呢?
答案 0 :(得分:0)
我看不到您在列表中添加任何内容,因此它将始终返回0。您有两个选择,要么获取包含一些数据的列表,要么像这样存根。
doReturn(1).when(mockPackageManager).queryIntentServices(any(Intent.class), anyInt()).size();
然后在正确调用方法后进行验证或声明内容。
答案 1 :(得分:0)
我建议您修改您的MyIntentProvider
类,使其更具可测试性。换句话说,创建一个提供matchedServices
的变量,而不是从另一个类获取它。您的课程可能如下所示。
public class MyIntentProvider {
private List<Service> matchedServices;
private Info info;
public void setInfo(Info info) {
this.info = info;
}
public Info getInfo() {
return this.info;
}
public List<Service> getMatchedServices() {
return this.matchedServices;
}
public void setMatchedServices(List<Service> matchedServices) {
this.matchedServices = matchedServices;
}
public Intent provideIntent(final Context context) {
final Intent intent = new Intent();
intent.setAction(MY_ACTION);
final List<ResolveInfo> matchedServices = context.getPackageManager().queryIntentServices(intent, 0);
if(matchedServices != null && matchedServices.size() == 1) {
String packageName = info.serviceInfo.packageName;
String serviceName = info.serviceInfo.name;
intent.setComponent(new ComponentName(packageName, serviceName));
}
return intent;
}
}
一旦您如上所述建立了类,则为该类编写测试变得更加容易。如果没有必要,您实际上不必模拟实例。
public class MyIntentProviderTest {
private MyIntentProvider myIntentProvider;
private Info dummyInfo;
private List<Service> dummyMatchedServices;
@Before
public void setup() {
myIntentProvider = new MyIntentProvider();
dummyInfo = new Info();
dummyMatchedServices = getDummyMatchedServices(); // Just return a dummy list as per your need
// Now set it here
myIntentProvider.setInfo(dummyInfo);
myIntentProvider.setMatchedServices(dummyMatchedServices);
}
@After
public void tearDown() {
myIntentProvider = null;
dummyInfo = null;
dummyMatchedServices = null;
}
@Test
public void testHere() {
// Do the testing here
}
}
我希望有帮助。