1

我有一个 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();
}

这是我得到的错误:

 [exec] com.vsnetworks.vsnmedia.test.TestMimeTypes:INSTRUMENTATION_RESULT: shortMsg=java.lang.NullPointerException
 [exec] INSTRUMENTATION_RESULT: longMsg=java.lang.NullPointerException: Unable to start activity ComponentInfo{com.vsnetworks.vsnmedia/com.vsnetworks.vsnmedia.MainActivity}: java.lang.NullPointerException
 [exec] INSTRUMENTATION_CODE: 0

我认为这是与上下文相关的,因为如果我执行以下操作:

Context context = this.getInstrumentation().getTargetContext();

我明白了(第 37 行是 context.getExternal 行)

 [exec] com.vsnetworks.vsnmedia.test.TestMimeTypes:
 [exec] Error in test:
 [exec] java.lang.NullPointerException
 [exec]     at com.vsnetworks.vsnmedia.test.TestMimeTypes.test(TestMimeTypes.java:37)
 [exec]     at java.lang.reflect.Method.invokeNative(Native Method)
 [exec]     at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:214)
 [exec]     at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:199)
 [exec]     at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:192)
 [exec]     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
 [exec]     at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
 [exec]     at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
 [exec]     at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)
 [exec] 
 [exec] Test results for InstrumentationTestRunner=..E
 [exec] Time: 0.292
 [exec] 
 [exec] FAILURES!!!
 [exec] Tests run: 2,  Failures: 0,  Errors: 1

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

context = getInstrumentation().getContext();
context = getInstrumentation().getTargetContext();
context = activity.getApplicationContext();
context = activity.getBaseContext();

那么我到底做错了什么?

编辑 1 - 看来这个问题只发生在模拟器上。如果我使用真实设备运行测试,它们都会通过。

4

2 回答 2

1

我想这就是你要找的:

public void testExternalFilesDir() {
    Activity activity = getActivity();
    assertNotNull(activity);
    File file = activity.getExternalFilesDir(null);
    assertNotNull("No external storage available", file);
}
于 2013-02-20T23:40:55.657 回答
0

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

当测试项目在 libs 目录中有 jar 时,无法构建和运行使用“ant create test-project”创建的 android 测试项目

这让我想到了这个:

使用带有库项目的 ant 进行 Android 单元测试

使用带有库项目 R18 的 ant 进行 Android 单元测试

然而,我的修复略有不同。我没有在这些项目中使用覆盖的 -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 卡无法正常工作。我不确定确切的原因,但创建一个新的似乎可以解决问题。

<sdk>/tools/mksdcard <size> <path>

<sdk>/emulator -avd <name> -sdcard <path.from.above>
于 2013-02-21T16:01:05.500 回答