获取上下文时的Android ActivityInstrumentationTestCase2 NullPointerException

获取上下文时的Android ActivityInstrumentationTestCase2 NullPointerException,android,android-testing,Android,Android Testing,我有一个ActivityInstrumentationTestCase2,但我没有幸获得测试的上下文 package com.vsnetworks.vsnmedia.test; import org.json.JSONObject; import android.app.Activity; import android.content.Context; import android.test.ActivityInstrumentationTestCase2; import com.vsne

我有一个ActivityInstrumentationTestCase2,但我没有幸获得测试的上下文

package com.vsnetworks.vsnmedia.test;

import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase2;

import com.vsnetworks.vsnmedia.MainActivity;
import com.vsnetworks.vsnmedia.VSWebViewClient;

public class TestMimeTypes extends ActivityInstrumentationTestCase2<MainActivity> {

Activity activity;
Context context;

public TestMimeTypes() {
    super(MainActivity.class);
}

public void setUp() throws Exception {
    super.setUp();
    activity = getActivity();
    context = activity.getApplicationContext();
}

public void test() {
    String external = context.getExternalFilesDir(null).toString();
}
我认为这是与上下文相关的,因为如果我执行以下操作:

Context context = this.getInstrumentation().getTargetContext();
我得到(第37行是context.getExternal行)

我也用同样的错误尝试了下面的所有方法,甚至在一些地方使用了getInstrumentation.waitForIdleSync()(我在另一个线程中看到)。我尝试过创建新的MainActivity()对象,并从中获取上下文以及getActivity(),同样的问题

context = getInstrumentation().getContext();
context = getInstrumentation().getTargetContext();
context = activity.getApplicationContext();
context = activity.getBaseContext();
<sdk>/tools/mksdcard <size> <path>

<sdk>/emulator -avd <name> -sdcard <path.from.above>
那我到底做错了什么


编辑1-此问题似乎只发生在模拟器上。如果我使用真正的设备来运行测试,它们都会通过。

我想这就是您想要的:

public void testExternalFilesDir() {
    Activity activity = getActivity();
    assertNotNull(activity);
    File file = activity.getExternalFilesDir(null);
    assertNotNull("No external storage available", file);
}

我想这就是你想要的:

public void testExternalFilesDir() {
    Activity activity = getActivity();
    assertNotNull(activity);
    File file = activity.getExternalFilesDir(null);
    assertNotNull("No external storage available", file);
}

实际上有两个问题我必须解决。首先,我的主要项目中包含了一个外部库。运行测试时,未正确添加外部库。创建main时,它在尝试使用库时失败。为了解决这个问题,我在这里遵循了各种解决方案:

这让我想到了这一点:

然而,我的方案略有不同。我没有在这些项目中使用overrided-compile标记,而是简单地将/tools/ant中的build.xml编译复制到测试的build.xml中,并添加了

            <classpath>
                <!-- steff: we changed one line here !-->
                <fileset dir="${tested.android.library.reference.1}/bin/" includes="*.jar"/>
                <fileset dir="${extensible.libs.classpath}" includes="*.jar" />
            </classpath>

和第二个答案在同一个地方

第二个问题是模拟器试图使用的sd卡不工作。我不确定确切的原因,但创建一个新的似乎解决了问题

context = getInstrumentation().getContext();
context = getInstrumentation().getTargetContext();
context = activity.getApplicationContext();
context = activity.getBaseContext();
<sdk>/tools/mksdcard <size> <path>

<sdk>/emulator -avd <name> -sdcard <path.from.above>
/tools/mksdcard
/仿真器-avd-sdcard

实际上,我必须解决两个问题。首先,我的主要项目中包含了一个外部库。运行测试时,未正确添加外部库。创建main时,它在尝试使用库时失败。为了解决这个问题,我在这里遵循了各种解决方案:

这让我想到了这一点:

然而,我的方案略有不同。我没有在这些项目中使用overrided-compile标记,而是简单地将/tools/ant中的build.xml编译复制到测试的build.xml中,并添加了

            <classpath>
                <!-- steff: we changed one line here !-->
                <fileset dir="${tested.android.library.reference.1}/bin/" includes="*.jar"/>
                <fileset dir="${extensible.libs.classpath}" includes="*.jar" />
            </classpath>

和第二个答案在同一个地方

第二个问题是模拟器试图使用的sd卡不工作。我不确定确切的原因,但创建一个新的似乎解决了问题

context = getInstrumentation().getContext();
context = getInstrumentation().getTargetContext();
context = activity.getApplicationContext();
context = activity.getBaseContext();
<sdk>/tools/mksdcard <size> <path>

<sdk>/emulator -avd <name> -sdcard <path.from.above>
/tools/mksdcard
/仿真器-avd-sdcard

您需要使用
getInstrumentation().getTargetContext()
!您需要使用
getInstrumentation().getTargetContext()