我正在尝试使用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?我的设置似乎没问题....
答案 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上下文存在,你可以通过创建应用程序或活动来获得它。