测试服务是否已启动

时间:2014-09-22 10:26:07

标签: android unit-testing testing junit

我有一个启动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或其他框架可以实现吗?

2 个答案:

答案 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