java - 在 AndroidTestCase 中调用 MockitoAnnotations.initMocks() 时的 NPE

标签 java android testing gradle mockito

尝试在我的 AndroidTestCase 中使用 mockito。我将依赖项添加到 build.gradle 中:

final DEXMAKER_VERSION = '1.2'

dependencies {
    // ...
    androidTestCompile "com.google.dexmaker:dexmaker:${DEXMAKER_VERSION}"
    androidTestCompile "com.google.dexmaker:dexmaker-mockito:${DEXMAKER_VERSION}"
    androidTestCompile 'org.mockito:mockito-core:1.10.19'

}

带有 mockito 初始化的 TestCase:

public class UsersListPresenterTest extends AndroidTestCase {

    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    public void testInitialize() throws Exception {

    }
}

但是一旦我向类添加任何属性,甚至在添加任何注释之前,测试就开始崩溃:

public class UsersListPresenterTest extends AndroidTestCase {

    String mockString;

    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    public void testInitialize() throws Exception {

    }
}

使用以下堆栈跟踪

java.lang.NullPointerException: Attempt to invoke virtual method 
    'java.lang.Class java.lang.Object.getClass()' on a null object reference
at com.google.dexmaker.mockito.DexmakerMockMaker.getInvocationHandlerAdapter(DexmakerMockMaker.java:80)
at com.google.dexmaker.mockito.DexmakerMockMaker.getHandler(DexmakerMockMaker.java:75)
at org.mockito.internal.util.MockUtil.isMockitoMock(MockUtil.java:74)
at org.mockito.internal.util.MockUtil.isMock(MockUtil.java:66)
at org.mockito.internal.configuration.injection.scanner.MockScanner.isMockOrSpy(MockScanner.java:86)
at org.mockito.internal.configuration.injection.scanner.MockScanner.preparedMock(MockScanner.java:72)
at org.mockito.internal.configuration.injection.scanner.MockScanner.scan(MockScanner.java:61)
at org.mockito.internal.configuration.injection.scanner.MockScanner.addPreparedMocks(MockScanner.java:47)
at org.mockito.internal.configuration.InjectingAnnotationEngine.injectMocks(InjectingAnnotationEngine.java:96)
at org.mockito.internal.configuration.InjectingAnnotationEngine.processInjectMocks(InjectingAnnotationEngine.java:62)
at org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:56)
at org.mockito.MockitoAnnotations.initMocks(MockitoAnnotations.java:108)
at com.myproject.presentation.UsersListPresenterTest.setUp(UsersListPresenterTest.java:28)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1853)

我做错了什么?

最佳答案

你可以尝试替换

MockitoAnnotations.initMocks(this);

有了这个

System.setProperty("dexmaker.dexcache", getContext().getCacheDir().getPath());

它对我有用。 See ref here

关于java - 在 AndroidTestCase 中调用 MockitoAnnotations.initMocks() 时的 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30590470/

相关文章:

java - 如何在 Mac 应用程序菜单中隐藏 "Preferences"项

java - 服务器发送的事件不适用于 Jersey SSE

java - 如何处理java代码中的Unchecked强制转换警告

java - 动态添加 Android 单选按钮的问题

java - 函数If/else无法正确运行_app android使用加速度计

c# - 如何测试函数返回 IEnumerable<Integer>

java - 无法在 Android 手机和 PC 之间建立客户端服务器蓝牙串行连接

android - Kotlin 1.2.40 版本上的 Kotlin 房间数据库崩溃

testing - 使用 Intellij 运行测试时为 "Test events were not received"

firefox - 测试不同版本的非IE浏览器