【问题标题】:Android - Unit Testing that an activity has been started, and work on itAndroid - 活动已启动的单元测试,并对其进行处理
【发布时间】:2011-12-05 11:13:02
【问题描述】:

我正在测试一个对象,该对象在调用 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);
}

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

我发现这个被剪断了:

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

但它只返回类的名称,我想在活动的实例上声明一些东西。

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

谢谢:-)

朱利安

【问题讨论】:

    标签: android unit-testing junit


    【解决方案1】:

    好的,我找到了解决方案: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);
    
        //...
    
    }
    

    【讨论】:

      【解决方案2】:

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

      如果您正在编写功能测试,那么值得一看 Robotium。 Robotium 是“一个测试框架,可以轻松地为 Android 应用程序编写强大且健壮的自动黑盒测试用例”。他们提供的 Solo 类内部是一个 getCurrentActivity() 方法,该方法应该返回您正在寻找的类的一个实例(在幕后,他们看起来像是在 ActivityInstrumentationTestCase2 提供的 Instrumentation 实例上设置一个 ActivityMonitor)。

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

      希望这会有所帮助。

      【讨论】:

      • 抱歉,我想包含更多超链接,但作为一个新用户,我仅限于 2 个(呸!)
      • 谢谢,我已经投了赞成票,你不应该长时间成为新用户 :-) 我听说过这些工具,但我们正在努力坚持使用提供的工具,因为我们希望将测试集成到我们的持续构建中。不过,我们必须看看它。
      • 好的,祝你好运。实际上,我在 CI 构建中同时使用了 Robotium 和 Robolectric,它们工作得很好。事实上,使用 Robolectric 的东西通常比提供的工具要好,因为测试执行得更快,允许您编写更具体的“单元”式测试(这有助于缺陷隔离并涉及编写更少的设置代码),并且因为它们像普通的 JUnit 测试一样运行,您可以从所有可用的其他工具/插件支持中受益。
      • 谢谢,您使用哪个 CI 和 IDE?我们将 TeamCity 用于 CI,并使用 Eclipse 和 IntelliJ
      • 我们的设置是 Eclipse、Maven 和 Android Maven plugin 和 Jenkins/Hudson 和 Android Emulator plugin。后者非常适合功能测试,因为它允许您配置构建矩阵以针对您想要支持的所有不同设备配置。我没有使用 Intellij 或 TeamCity 的经验,但我的理解是 Maven 支持两者都很好,我认为 Android Maven 插件可以在 Intellij 中工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多