活动单元测试

时间:2012-02-20 21:47:52

标签: android unit-testing

我有一项活动,在后台执行一些工作,并根据这项工作的结果开始另外两项活动之一。如何编写单元测试来验证其行为?

我尝试使用ActivityUnitTestCase,但它试图显示进度对话框。使用ActivityInstrumentationTestCase2我找不到任何方法来拦截活动破坏。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

ActivityInstrumentationTestCase2是正确的方法,因为其他类已弃用。要测试主要活动后发生的情况,我们称之为ProgressActivity,您应该使用ActivityMonitor。我想你想拦截Activity创造,而不是破坏。

我假设ProgressActivity在后台完成一些计算之后开始另一个Activity(假设A1A2A3)。

您的测试用例应该是这样的:

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中的类别,因为如果你依赖getLastActivity(),你可能会感到失望,因为它似乎总是空的。为了能够匹配此类别,您应该在开始A1A2A3Intent.addCatrgory())时使用它

此示例改编自在ActivityMonitor中说明Android Application Testing Guide的示例。