检测测试:getActivity()导致NullPointerException

moa*_*fee 4 android android-studio

当我运行我的测试时,我收到此错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.app.Instrumentation.setInTouchMode(boolean)'

在android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:100)

at com.example.my_project.MyActivityTest.setup(MyActivityTest.java:46)

这是我的代码:

@RunWith(AndroidJUnit4.class)
public class MyActivityTest extends ActivityInstrumentationTestCase2<MyActivity> {

    private MyActivity myActivity;
    // ...

    public MyActivityTest() {
        super(MyActivity.class);
    }

    @Before
    public void setup() throws Exception {
        super.setUp();

        setActivityInitialTouchMode(true);
        myActivity = getActivity();
    }
Run Code Online (Sandbox Code Playgroud)

我也试过用这样的测试方法替换上面的大部分代码:

@Test
public void testActivityNotNull() {
    MyActivity myActivity = getActivity();
    assertNotNull(myActivity);
}
Run Code Online (Sandbox Code Playgroud)

但我得到了同样的错误.为什么会这样?

Def*_*era 7

终于想通了.您需要添加以下代码行:

injectInstrumentation(InstrumentationRegistry.getInstrumentation());
Run Code Online (Sandbox Code Playgroud)

在调用getActivity()之前.所以在你的情况下你会有这样的设置方法:

  @Before
  public void setUp() throws Exception {
    super.setUp();

    // Injecting the Instrumentation instance is required
    // for your test to run with AndroidJUnitRunner.
    injectInstrumentation(InstrumentationRegistry.getInstrumentation());
    mMainActivity = getActivity();
}
Run Code Online (Sandbox Code Playgroud)

已在官方文档中找到答案:http://developer.android.com/tools/testing-support-library/index.html#AndroidJUnitRunner