2012-02-20 5 views
4

나는 백그라운드에서 일부 작업을 수행하는 활동이 있으며이 작업의 결과에 따라 두 가지 다른 활동 중 하나가 시작됩니다. 어떻게 그것의 행동을 검증하기 위해 단위 테스트를 작성할 수 있습니까?활동 단위 테스트

ActivityUnitTestCase를 사용하려고했지만 진행 대화 상자를 표시하려고하면 불어납니다. ActivityInstrumentationTestCase2를 사용하면 활동 파괴를 가로 챌 수있는 방법을 찾지 못했습니다. 충고 하나 하나?

답변

4

ActivityInstrumentationTestCase2은 다른 클래스가 사용되지 않는 올바른 접근 방식입니다. 주요 활동 후에 무슨 일이 있었는지 테스트하려면 ProgressActivity으로 전화를 걸고 ActivityMonitor을 사용해야합니다. 나는 당신이 파괴가 아니라 Activity 창조물을 가로 채고 싶다고 생각합니다.

나는 ProgressActivity 다른 Activity를 시작하는 것이 여기에 있으리라 믿고있어 약간의 계산이 백그라운드에서 수행 한 후 (의이 A1, A2, 또는 A3을 가정 해 봅시다). 당신이 getLastActivity()에 의존하는 경우 항상 null 것 같다 당신이 실망 할 수 있기 때문에,

public static final HashSet<Class<? extends Activity>> TARGET_ACTIVITIES = new HashSet<Class<? extends Activity>>(); 
static { 
    TARGET_ACTIVITIES.add(A1.class); 
    TARGET_ACTIVITIES.add(A2.class); 
    TARGET_ACTIVITIES.add(A3.class); 
} 

private static final int TIMEOUT = 7000; 

public void testRandomActivityStarted() { 
    @SuppressWarnings("unused") 
    ProgressActivity activity = getActivity(); 
    final Instrumentation inst = getInstrumentation(); 
    IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MAIN); 
    intentFilter.addCategory("MY_CATEGORY"); 
    ActivityMonitor monitor = inst.addMonitor(intentFilter, null, false); 
    // Wait, before the Activity started 
    monitor.waitForActivityWithTimeout(TIMEOUT); 
    assertEquals(1, monitor.getHits()); 
    Activity randomActivity = monitor.getLastActivity(); 
    Log.d(TAG, "monitor=" + monitor + " activity=" + randomActivity); 
    // Unfortunately, it seems randomActivity is always null even after a match 
    if (randomActivity != null) { 
     assertTrue(TARGET_ACTIVITIES.contains(randomActivity.getClass())); 
    } 
    inst.removeMonitor(monitor); 
} 

여기에 트릭이 IntentFilter에서 카테고리를 사용하는 것입니다

귀하의 테스트 케이스는 다음과 같이해야한다. 당신이 A1, A2 또는 A3 (Intent.addCatrgory())

이 예제는 Android Application Testing GuideActivityMonitor을 도시 하나에서 적응했다을 시작할 때 당신이 그것을 사용해야하는이 범주를 일치시킬 수 있습니다.

+0

올바른 방향으로 안내해 주셔서 감사합니다. 제안 된 코드 샘플에는 몇 가지 문제점이 있습니다. 먼저 getActivity를 호출하기 전에 모니터를 설정해야합니다. 더 중요한 것은, waitForActivity는 그것이 타격당한 활동을 리턴하고 널 (null)로 재설정합니다. 이것이 getLastActivity가 null을 돌려주는 이유입니다. 따라서 getActivity를 중계하는 대신 wait에 의해 반환 된 값을 사용해야합니다 ... – mfeingold

+0

getActivity 전에 모니터를 설정하면 2 개의 안타가 발생할 수 있으며 테스트가 실패 할 수 있습니다. 물론 관련 활동의 구체적인 세부 정보에 따라 다릅니다 . getLastActivity에 대해서는 waitForActivity가 반환 한 값을 사용하는 것이 좋습니다. –

+0

또 다른 한가지 - 범주를 제거했고 여전히 잘 작동합니다. 따라서 분명히 여기에 카테고리를 사용할 필요가 없습니다. – mfeingold