在测试中的类不是活动时,获取在AndroidTestCase中使用的上下文

时间:2013-11-05 16:05:43

标签: java android unit-testing android-testing

我正在尝试使用AndroidTestCase进行测试。我试图在我的应用程序中只测试一个特定的类,但是这个类不会扩展Activity,Service或其他任何东西。它基本上是一个普通的Java类,除了它需要一个Context。它是一个pojo,它的一些变量是在它们的创建中需要android api调用的对象,例如调用SensorManager。 我试着用:

Context context = getContext();

运行我的测试时,这给了我一个例外“在onCreate()之前不能用于活动的系统服务”。这种方法是否必须被覆盖? final Context context = new IsolatedContext(null, getContext())给出了相同的东西。

我使用Android测试框架而不是像Robolectric这样的原因是因为我正在测试的类收集有关设备的硬件信息,所以我想在实际设备上运行测试。我查看了AndroidTestCase的开发人员文档但看不到我在示例中寻找的内容。我不确定其他测试用例类是否能实现我想要的。有任何想法吗?

我的测试班:

public class DeviceTest extends AndroidTestCase {
ClassToTest mClassToTest;

@Override
protected void setUp() throws Exception {
final Context context = new IsolatedContext(null, getContext()) {
        @Override
        public Object getSystemService(final String pName) {
            return getContext().getSystemService(pName);
        }
    };

mClassToTest = new ClassToTest(context);
 super.setUp();
}

public void testClassMethod() {
 Object mObject;
 mObject = mClassToTest.getObject();
 assertNotNull(mObject);
}

@Override
protected void tearDown() throws Exception {
 mClassToTest = null;
 super.tearDown();
}
}

提前致谢。

更新:将我的设置更改为以下内容后:

 @Override
 protected void setUp() throws Exception {
 super.setUp();
 context = this.getContext();
 mClassToTest = new ClassToTest(context);
}

我收到上下文为空的错误。在什么情况下AndroidTestCase.getContext()会返回null?我的设置似乎没问题....

3 个答案:

答案 0 :(得分:1)

从AndroidTestCase可以直接访问mContext,或者调用getContext()。

从那些返回的上下文中,如果你想要那个,你也可以调用Context.getApplicationContext()。

答案 1 :(得分:1)

您可以使用超类中的mContext(AndroidTestCase)。我用它来测试需要上下文的数据库。

<强> AndroidTestCase.class

public class AndroidTestCase extends TestCase {
    protected Context mContext;
    ...
}

您可以在继承的AndroidTestCase类中使用Context。

<强> TestDb.java

public class TestDb extends AndroidTestCase {
    void deleteTheDatabase() {mContext.deleteDatabase(DB_NAME)};
}

答案 2 :(得分:0)

有几种解决方法,您可以使用mockcontext作为一个解决方案,或者如果您真的不关心上下文是什么有效,您可以使用InstrumentationTestCase并通过getInstrumentation获取测试apk的上下文( ).getContext()。

我认为你的上下文为null的原因是此时实际上没有android上下文存在,你可以通过创建应用程序或活动来获得它。