2012-06-09 11 views
45

私はリモートのandroidサービスとやりとりする小さなアプリを持っています。私はユニットテストでそのサービスを模擬したいと思います。私はRobolectricJUnitを他のテストケースやシャドウに使用していますが、リモートサービスの処理方法を理解できませんでした。リモートアンドロイド補助サービスをテストする方法

実際のサービスとエクスポート方法で同じパッケージを使用してテストサービスを作成して起動するだけで十分ですか?aidl

私はそのサービスのコードを持っていないので、私はRobolectricShadowServiceを実際のクラスが必要とすることはできないと思っています。

ありがとうございます。

+0

リンクが壊れていると思います。 – PunDefeated

+0

リモートサービス、またはリモートアンドロイドサービスとやりとりしている小さなアプリをテストしていますか?アプリをテストしている場合は、インターフェイスにコーディングすることから始めます。リモートサービスへのすべての呼び出しは、インターフェイスで行う必要があります。 小さなアプリケーションには、実際にリモートサービスを呼び出すインターフェイスの実装があります。テストパッケージには、リモートサービスから返された情報を模倣する2番目の実装があります。 各テストでは、テストパッケージの実装で使用されるメモリデータにバッキングを構成できます。 –

+0

私はアンドロイドでこのようなことをしていませんが、他のJavaアプリケーションでは春に持っていますので、正確な解決策は不明です。 –

答えて

1

私はMockitoを使ってインターフェイスのモックを作成し、そのインスタンスをテストのコードに渡します。また、テストコードにそのインタフェースの実装を手動で作成して使用することもできます。

あなたは自分で嘲笑をする必要があります。テストしたいコードが依存インターフェース注入を使用してaidlインターフェースへの参照を取得することが重要ですので、あなた自身の疑似テストをテストに渡すことができます。

0

サービスの単体テストを作成する場合は、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); 
    } 
} 
関連する問題