Android在测试包中测试新服务

时间:2018-01-10 23:42:28

标签: java android junit android-testing android-instrumentation

我想在框架中测试一个类,该类根据intent启动不同的服务。但是,当运行连接的android测试时,我在TestService内创建androidTest/时遇到问题。 getService方法返回null

提前感谢任何指导和帮助!

@RunWith(AndroidJUnit4.class)
public class WakefulIntentSenderTest {
    private static final String SOME_ACTION = "someAction";

    private static class TestService extends Service {
        private boolean mCalled;

        @Override
        public void onCreate() {
            super.onCreate();
        }

        @Override
        public IBinder onBind(final Intent intent) {
            return null;
        }

        @Override
        public int onStartCommand(final Intent intent, final int flags, final int startId) {
            mCalled = true;
            return 0;
        }

        public boolean wasCalled() {
            return mCalled;
        }

        public class TestServiceBinder extends Binder {

        public TestService getService() {
            return TestService.this;
        }
    }

    @Test
    public void testWithBoundService() throws TimeoutException {
        // Create the service Intent.
        Intent serviceIntent =
                new Intent(InstrumentationRegistry.getTargetContext(), TestService.class);

        InstrumentationRegistry.getTargetContext().startService(intent);

        // Bind the service and grab a reference to the binder.
        IBinder binder = mServiceRule.bindService(serviceIntent);

        // Get the reference to the service, or you can call public methods on the binder directly.
        TestService service = ((TestService.TestServiceBinder) binder).getService();

        // Verify that the service is working correctly.
        assertEquals(service.wasCalled(), true);
    }
}

我还有其他问题,其中TestService实际上是在“Test”包中创建的。如果我尝试通过应用程序上下文启动TestService,则会出现错误,指出Unable to start service Intent { cmp=com.example.abc.test/com.example.abc.WakefulIntentSenderTest$TestService } U=0: not found错误。

以上代码实际上只是为了证明我是否可以启动服务。

更多信息......在调用com.example.abc时,InstrumentationRegistry会返回getTargetContext(),而在调用com.example.abc.test时会返回getContext()

我真正想要测试的是com.example.abc背后的一个类,它使用PowerManager来启动一个Wakelock的服务。但是现在我已经想到了,因为我甚至无法从测试包中启动服务。

不幸的是,在主包中包含TestService也不是我的选择:(

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:0)

您需要在TestService#onBind中返回TestServiceBinder类的实例