2012-06-09 149 views
45

我有一個小應用程序,與遠程android服務交互。我想在單元測試中嘲笑這項服務。我用RobolectricJUnit其他測試用例和陰影,但我想不出如何處理遠程服務。如何測試遠程Android AIDL服務

是否有足夠的創建和使用相同的封裝,使用相同aidl真正的服務和導出方法開始測試服務?

由於我沒有該服務的代碼,我假設我不能使用RobolectricShadowService,這需要實際的類在那裏。

非常感謝。

+0

我認爲您的鏈接已損壞。 – PunDefeated

+0

您正在測試遠程服務還是與遠程Android服務交互的小應用程序?如果您正在測試應用程序,我將開始編碼到一個界面。所有對遠程服務的調用都應該通過接口完成。 你的小應用程序將具有實際調用遠程服務的接口的實現。您的測試軟件包將有第二個實現模擬從遠程服務返回的信息。 每個測試可以配置內存中的數據有些來頭所使用的測試包的實現。 –

+0

我沒有做android系統中這樣的事情,但有與其他Java應用程序春天,所以我不能確定一個確切的解決方案。 –

回答

1

我會用Mockito創建接口的模擬,然後將該實例傳遞給你的代碼在你的測試。您也可以在測試代碼中手動創建該接口的實現並使用它。

所以你必須自己去嘲笑,你想要測試的代碼使用某種形式的依賴注入來獲取對aidl接口的引用是很重要的,所以你可以在你的測試中傳遞你自己的模擬。

0

如果你想要寫服務的話,你可以使用針對的Mockito behavior.If要在實際設備上測試您的服務嘲諷服務單元測試,那麼這是你怎麼能與您的服務進行連接。

@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); 
    } 
}