Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当被测类不是活动时,获取用于AndroidTestCase的上下文_Java_Android_Unit Testing_Android Testing - Fatal编程技术网

Java 当被测类不是活动时,获取用于AndroidTestCase的上下文

Java 当被测类不是活动时,获取用于AndroidTestCase的上下文,java,android,unit-testing,android-testing,Java,Android,Unit Testing,Android Testing,我正在尝试使用AndroidTestCase进行测试。我试图在我的应用程序中只测试一个特定的类,但是这个类不扩展活动、服务或其他任何东西。它基本上是一个普通的Java类,只是需要一个上下文。它是一个pojo,它的一些变量是在创建时需要android api调用的对象,例如对SensorManager的调用。 我尝试使用: Context context = getContext(); 在运行测试时,这会给我一个异常“系统服务在onCreate()之前不可用于activites”。是否必须重写该

我正在尝试使用AndroidTestCase进行测试。我试图在我的应用程序中只测试一个特定的类,但是这个类不扩展活动、服务或其他任何东西。它基本上是一个普通的Java类,只是需要一个上下文。它是一个pojo,它的一些变量是在创建时需要android api调用的对象,例如对SensorManager的调用。 我尝试使用:

Context context = getContext();
在运行测试时,这会给我一个异常“系统服务在onCreate()之前不可用于activites”。是否必须重写该方法<代码> 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?我的设置似乎还可以

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


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

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


如果需要,还可以从这些返回的上下文调用context.getApplicationContext()。

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

AndroidTestCase.class

public class AndroidTestCase extends TestCase {
    protected Context mContext;
    ...
}
您将能够在继承的AndroidTestCase类中使用上下文

TestDb.java

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

为什么你不能创建一个在上下文中传递的构造函数?@tyczj你能解释一下吗?我的ClassToTest对象在其构造函数中使用上下文:mClassToTest=newclasstotest(上下文)。我的测试项目与测试中的应用程序是分开的,因此我不确定如何在我的测试类中创建/获取与AUT相关的上下文。我的理解是调用AndroidTestCase.getContext为测试项目提供了上下文,而不是正在测试的项目。。。所以我应该使用其他的东西来代替吗?抱歉,AndroidTestCase.getContext()似乎应该返回被测试应用程序的上下文,但是它为我返回null:(这个答案为null情况提供了一个解决方法