我有一项活动,在后台执行一些工作,并根据这项工作的结果开始另外两项活动之一。如何编写单元测试来验证其行为?
我尝试使用ActivityUnitTestCase,但它试图显示进度对话框。使用ActivityInstrumentationTestCase2我找不到任何方法来拦截活动破坏。有什么建议吗?
答案 0 :(得分:4)
ActivityInstrumentationTestCase2
是正确的方法,因为其他类已弃用。要测试主要活动后发生的情况,我们称之为ProgressActivity
,您应该使用ActivityMonitor。我想你想拦截Activity
创造,而不是破坏。
我假设ProgressActivity在后台完成一些计算之后开始另一个Activity
(假设A1
,A2
或A3
)。
您的测试用例应该是这样的:
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()
,你可能会感到失望,因为它似乎总是空的。为了能够匹配此类别,您应该在开始A1
,A2
或A3
(Intent.addCatrgory())时使用它
此示例改编自在ActivityMonitor中说明Android Application Testing Guide的示例。