2012-06-09 3 views
45

원격 android 서비스와 상호 작용하는 작은 앱이 있습니다. 나는 단위 테스트에서 그 서비스를 조롱하고 싶다. 나는 다른 테스트 케이스와 그림자를 위해서 RobolectricJUnit을 사용하지만 원격 서비스를 다루는 방법을 생각할 수 없었다.원격 Android 서비스를 테스트하는 방법

실제 서비스 및 내보내기 방법이 동일한 패키지를 사용하여 테스트 서비스를 만들고 시작하는 것으로 충분합니까? aidl?

해당 서비스에 대한 코드가 없기 때문에 RobolectricShadowService 실제 클래스가 있어야 사용할 수 있다고 가정합니다.

고마워요.

+0

링크가 깨졌습니다. – PunDefeated

+0

원격 서비스 또는 원격 Android 서비스와 상호 작용하는 작은 응용 프로그램을 테스트하고 있습니까? 앱을 테스트하는 중이라면 인터페이스로 코딩하는 것으로 시작합니다. 원격 서비스에 대한 모든 호출은 인터페이스로 수행되어야합니다. 작은 응용 프로그램에는 실제로 원격 서비스를 호출하는 인터페이스가 구현되어 있습니다. 테스트 패키지에는 원격 서비스에서 반환 된 정보를 조롱하는 두 번째 구현이 있습니다. 각 테스트는 테스트 패키지 구현에서 사용되는 메모리 데이터에서 일부 백업을 구성 할 수 있습니다. –

+0

나는 안드로이드에서 이런 식으로 일을하지 않았지만 다른 자바 애플리케이션에서 봄을 가지고 있으므로 정확한 해결책이 확실하지 않습니다. –

답변

1

나는 Mockito을 사용하여 인터페이스 모의 (Mock)를 만든 다음 해당 인스턴스를 테스트의 코드에 전달합니다. 테스트 코드에서 해당 인터페이스의 구현을 수동으로 생성하여 사용할 수도 있습니다.

너 자신을 조롱해야하고, 테스트하려는 코드가 의존 인터페이스에 대한 참조를 얻기 위해 어떤 형태의 의존성 주입을 사용하는 것이 중요하다. 그래서 테스트에서 자신의 모의을 넘길 수있다.

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); 
    } 
} 
관련 문제