我有一个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.get外部行)
[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 - 看起来这个问题只出现在模拟器上。如果我使用真实的设备运行测试,他们都会通过。
答案 0 :(得分:1)
我认为这就是你要找的东西:
public void testExternalFilesDir() {
Activity activity = getActivity();
assertNotNull(activity);
File file = activity.getExternalFilesDir(null);
assertNotNull("No external storage available", file);
}
答案 1 :(得分:0)
实际上我必须解决两个问题。首先是我的主项目中包含了一个外部库。运行测试时,未正确添加外部库。在创建main时,它在尝试使用库时无声地失败。为了解决这个问题,我在这里遵循了各种解决方案:
这让我想到了这个:
Android unit test using ant with library project
Android unit test using ant with library project R18
然而,我的修复略有不同。我只是将/ tools / ant中的build.xml编译复制到我的test的build.xml中并添加了
,而不是在这些项目中使用重写的-compile标记。 <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>