在活动开始之前访问活动

时间:2010-12-15 04:40:18

标签: android junit

我正在使用InstrumentationTestCase类来对活动中的某些内容进行单元测试。

我需要能够在启动此活动之前检查SharedPreferences的内容并进行编辑。

我无法使用setUp方法创建Activity并访问它的SharedPreferences对象进行编辑,然后在完成setUp方法之前关闭该活动,因为它显然锁定了测试处理。

在我在测试中启动活动后,我也无法访问SharedPreferences,因为一旦Activity启动,它就会在我有机会获得它之前更改SharedPreferences对象并按照它行动。

我之前显然无法访问SharedPreferences,因为我没有Activity对象......而且一旦我这样做,它就已经在执行代码并被启动......

所以,我的问题是,在我通过Intent实际创建Activity之前,有没有办法访问此Activity的SharedPreferences(以及任何其他Activity信息)?

我无法将其更改为ActivityInstrumentationTestCase2,因为我的测试在其进程中使用了第二个活动,因此我不能只更改为此类并使用它的setUp()方法来访问SharedPreferences。

3 个答案:

答案 0 :(得分:7)

我只通过检测找到了最简单的方法,无需编辑应用程序的体系结构或任何访问属性。

我通过这个实现了它:

Instrumentation instrumentation = getInstrumentation();
instrumentation.getTargetContext().getSharedPreferences(..);

这样我就可以在仪器启动任何Activity之前访问SharedPreferences。

感谢所有帮助,提示和其他替代方案。

答案 1 :(得分:3)

嗯...坦率地告诉你......我无法想象你的情景。但是在应用程序中检查信息是否可行?

创建一个扩展android.app.Application的类,并在Manifests子应用程序元素中指定类名。

示例代码:

import android.app.Application;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        //try and access activity info here.
    }
}

当您的应用程序启动时,第一类execture方法是onCreate of your application并且具有任何活动的所有生命周期事件。

您必须定义 清单中的扩展应用程序类:

<application
    android:name=".MyApplication"
    android:label="@string/application_name">

我希望这可以给你一些概述。

答案 2 :(得分:0)

我还没有尝试过,但是如果你将模式设置为MODE_WORLD_READABLE并且可能是MODE_WORLD_WRITEABLE而不是MODE_PRIVATE,我认为你可以在测试活动开始之前从另一个应用程序访问共享首选项。

您可能还可以在apk中使用不同的活动或服务,或者使用另一个建立共享用户ID且具有相同证书的apk来进行访问,而无需更改访问模式。