从AndroidTestCase调用活动

时间:2011-03-25 15:58:34

标签: android unit-testing android-activity android-testing

我正在编写一个android测试用例,需要对正在测试的Activity执行单独的Activity(不是为了测试而是为了获得对contentresolver的访问权限,所以我可以更改一些电话设置)。

是否可以从测试用例或其他方式开始活动。

我知道用于测试活动的AndroidTestCase类,我在测试中使用它,但是我需要使用ContentResolver来更改电话设置,然后测试被测活动的反应,所以我需要另一个应用程序组件来更改这些设置。

注意:我发布了多个活动测试背后的复杂性(需要一个ActivityManager),但我只想使用它的方法来改变设置,所以我甚至可以在o​​nCreate方法中使用逻辑。

2 个答案:

答案 0 :(得分:4)

Android为测试活动提供了一个特殊的检测框架。您必须使用此框架,因为活动具有复杂的生命周期,在此提供的框架之外是不可调用的。查看Activity Testing Android文档的Development部分中的Testing链接。如果这不能回答你的问题,你可能会稍微改写一下。

修改

你应该真正扩展ActivityUnitTestCase来测试一个Activity,而不是AndroidTestCase。您将获得更多针对您需要测试的功能。如果扩展ActivityUnitTestCase,则会有一个名为launchActivity的函数。它将启动您需要的活动并为您提供活动的实例,以便您可以调用其中的方法,例如set,get和finish。这应该做你一次操作单个和多个活动所需的任何事情。

示例代码:

@MediumTest
public class Test extends ActivityUniTestCase<HelloActivity> {

    public Test(Class<HelloActivity> activityClass) {
        super(activityClass);
    }

    @MediumTest
    public void testLifeCycleCreate() {
        HelloActivity hActivity = startActivity(new Intent(Intent.ACTION_MAIN), null, null);
        getInstrumentation().callActivityOnStart(hActivity);
        getInstrumentation().callActivityOnResume(hActivity);

        GoodByeActivity gActivity = launchActivity("package.goodbye", GoodByeActivity.class, null);
        gActivity.finish();
    }
}

答案 1 :(得分:2)

AndroidTestCase和ActivityInstrumentationTestCase2都提供了获取上下文的方法

AndroidTestCase:

getContext();

ActivityInstrumentationTestCase2

getInstrumentation().getContext();

您可以使用这些上下文来启动另一个活动,但是权限是从被测试的应用程序中采用的,因此在我使用contentresolver的情况下,我只有相同的权限来更改我在被测试的应用程序中执行的设置。

在我的情况下,这是不好的,所以我不得不创建一个单独的应用程序,它具有自己的权限和后台服务,然后我可以通过使用上下文启动意图来控制。