如何测试远程安卓辅助服务
2022-08-31 22:13:37
我有一个与远程服务交互的小应用程序。我想在单元测试中嘲笑这项服务。我使用Robolectric和其他测试用例和阴影,但我无法弄清楚如何处理远程服务。android
JUnit
使用具有真实服务的同一包创建和启动测试服务以及使用相同包的导出方法是否足够?aidl
由于我没有该服务的代码,因此我假设我不能使用 的 ShadowService,这需要实际的类才能存在。Robolectric
多谢。
我有一个与远程服务交互的小应用程序。我想在单元测试中嘲笑这项服务。我使用Robolectric和其他测试用例和阴影,但我无法弄清楚如何处理远程服务。android
JUnit
使用具有真实服务的同一包创建和启动测试服务以及使用相同包的导出方法是否足够?aidl
由于我没有该服务的代码,因此我假设我不能使用 的 ShadowService,这需要实际的类才能存在。Robolectric
多谢。
我会使用 Mockito 创建接口的 Mock,然后在测试中将该实例传递给您的代码。您还可以在测试代码中手动创建该接口的实现并使用该实现。
因此,您必须自己进行模拟,并且要测试的代码使用某种形式的依赖注入来获取对 aidl 接口的引用非常重要,这样您就可以在测试中传递自己的模拟。
如果你想为服务编写一个单元测试,那么你可以使用Mockito来模拟服务行为。如果要在真实设备上测试服务,则可以通过这种方式与服务连接。
@RunWith(AndroidJUnit4.class)
public classRemoteProductServiceTest {
@Rule
public final ServiceTestRule mServiceRule = new ServiceTestRule();
@Test
public void testWithStartedService() throws TimeoutException {
mServiceRule.startService(
new Intent(InstrumentationRegistry.getTargetContext(), ProductService.class));
//do something
}
@Test
public void testWithBoundService() throws TimeoutException, RemoteException {
IBinder binder = mServiceRule.bindService(
new Intent(InstrumentationRegistry.getTargetContext(), ProductService.class));
IRemoteProductService iRemoteProductService = IRemoteProductService.Stub.asInterface(binder);
assertNotNull(iRemoteProductService);
iRemoteProductService.addProduct("tanvi", 12, 12.2f);
assertEquals(iRemoteProductService.getProduct("tanvi").getQuantity(), 12);
}
}