我有一个启动IntentService的类:
public class MyClass(){
public void doStuff(){
Intent intent = new Intent(context, MyService.class);
intent.putExtra(KEY, stringExtra);
context.startService(intent);
}
}
现在我想进行单元测试MyClass
。我想检查启动我的服务的意图是否被触发,以及它是否有正确的额外内容。像这样:
public void testServiceStarted(){
MyClass myClass = new MyClass();
myClass.doStuff();
//Assert MyService was stated and received arguments
}
使用Instrumentation或其他框架可以实现吗?
答案 0 :(得分:0)
我不知道这是否是你要找的,但这可能有用。
private boolean isMyServiceRunning(Class<?> serviceClass,Context context) {
ActivityManager manager = (ActivityManager)context. getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(MySercice.service.getClassName())) {
Log.i("Service already","running");
return true;
}
}
Log.i("Service not","running");
return false;
}
如您所见,您将需要一个Context变量。
另一种可能的方法是在服务中以false
开始使用静态布尔值,然后在IntentService
开始时将其更改为true
。
希望有所帮助
答案 1 :(得分:0)
尽管这是一篇过时的文章,但我正在考虑回答可能对某人有帮助的问题。
我使用Roboelectric编写此类单元测试,这是您如何检查服务是否以正确的操作或意图启动的方法。
@Config(constants = BuildConfig.class)
@RunWith(RobolectricTestRunner.class)
public class MyServiceTest {
@Test
public void testMyServiceStartedWithRightActionAndIntent() {
final Intent realIntent = ShadowApplication.getInstance().getNextStartedService();
// Test if the service intent is not null
Assert.assertNotNull("Obtained the my service intent", realIntent);
// Test if the service intent has any extra with the maching name with MY_EXTRA
Assert.assertTrue("My service does not have the right extra", realIntent.hasExtra(MY_EXTRA));
// Test if the service has the right action.
Assert.assertEquals("My Service does not have right action", realIntent.getAction(), SERVICE_ACTION);
}
}
对于Roboelectric设置,请see this link。