我想在框架中测试一个类,该类根据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也不是我的选择:(
答案 0 :(得分:4)
https://developer.android.com/training/testing/integration-testing/service-testing.html
Android提供了获取服务引用的直接方式。
答案 1 :(得分:0)
您需要在TestService#onBind中返回TestServiceBinder类的实例