4

我正在尝试使用 AndroidTestCase 进行测试。我试图在我的应用程序中只测试一个特定的类,但是这个类不扩展 Activity、Service 或其他任何东西。除了它需要一个上下文之外,它基本上是一个普通的 Java 类。它是一个 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?我的设置似乎没问题......

4

3 回答 3

1

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

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

于 2014-04-21T19:51:46.353 回答
1

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

AndroidTestCase.class

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

您将能够在继承的 AndroidTestCase 类中使用 Context。

测试数据库.java

public class TestDb extends AndroidTestCase {
    void deleteTheDatabase() {mContext.deleteDatabase(DB_NAME)};
}
于 2016-02-11T02:55:16.233 回答
0

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

我认为您的上下文为空的原因是此时实际上不存在 android 上下文,您可以通过创建应用程序或活动来获得一个。

于 2013-12-18T23:03:49.863 回答