Android - 单元测试活动已经开始,并对其进行处理

时间:2011-12-05 11:13:02

标签: android unit-testing junit

我正在测试一个对象,该对象应该在调用open(url)方法时启动一个新活动:

public void open(String url) {
    Intent i = new Intent(getContext(), Browser.class);
    Log.d(TAG, "open:" + url);
    i.putExtra("URL", url);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    getContext().startActivity(i);
}

我想获取活动的实例,并根据URL检查一些参数。

我发现这个剪断了:

ActivityManager am = (ActivityManager) mActivity
    .getSystemService("activity");
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;

但它只返回类的名称,我想在活动的实例上断言。

有人知道如何做到这一点吗?

谢谢: - )

于连

2 个答案:

答案 0 :(得分:6)

好的,我找到了一个解决方案:ActivityMonitor类:

private Instrumentation.ActivityMonitor mBrowserActivityMonitor;

protected void setUp() throws Exception {
    super.setUp();

    mBrowserActivityMonitor = new Instrumentation.ActivityMonitor(Browser.class.getName(), null, false);
    getInstrumentation().addMonitor(mBrowserActivityMonitor);
    //...
}


public void testOpen()
{
    //...

    Activity activity = mBrowserActivityMonitor.waitForActivityWithTimeout(5 * 1000);
    assertNotNull("Activity was not started", activity);

    //...

}

答案 1 :(得分:2)

根据您正在编写的测试类型,您可以尝试以下选项:

如果您正在编写功能测试,那么值得查看Robotium。 Robotium是“一个测试框架,旨在为Android应用程序编写功能强大且强大的自动黑盒测试用例”。在他们提供的Solo类中是一个getCurrentActivity()方法,它应该返回你正在寻找的类的实例(在看起来他们在ActivityInstrumentationTestCase2提供的Instrumentation实例上设置ActivityMonitor)。

如果您正在编写单元测试,并且想要检查传递给startActivity()的Intent的属性,那么您可以提供自己的mock / spy上下文实例(如果你有可能在像Mockito这样的库的帮助下'在JVM上运行测试)。或者,您可以使用类似Robolectric的框架,该框架从其ShadowApplication类公开名为get / peekNextStartedActivity()的方法。有关如何使用它的更多信息,请访问他们的网站。

希望这有帮助。