【问题标题】:NPE when calling MockitoAnnotations.initMocks() in AndroidTestCase在 AndroidTestCase 中调用 MockitoAnnotations.initMocks() 时的 NPE
【发布时间】:2015-06-02 07:57:22
【问题描述】:

尝试在我的 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)

我做错了什么?

【问题讨论】:

    标签: java android testing gradle mockito


    【解决方案1】:

    你可以尝试替换

    MockitoAnnotations.initMocks(this);
    

    有了这个

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

    它对我有用。 See ref here

    【讨论】:

    • 这如何与 JUnit 4 测试一起使用?没有可以使用的getContext
    • @Matthias,你使用 InstrumentationRegistry.getTargetContext()。
    • 对,我同时想通了。谢谢。
    • @danielgomezrico 使用 - System.setProperty("dexmaker.dexcache", InstrumentationRegistry.getTargetContext().getCacheDir().getPath());
    • 另一种方式:System.setProperty("dexmaker.dexcache", activityTestRule.getActivity().getCacheDir().getPath())
    【解决方案2】:

    这是 dexmaker 中的一个错误,我已经提交了修复: https://github.com/crittercism/dexmaker/pull/24

    【讨论】:

    • 他们会合并这个吗?!
    • 因为我使用修改过的源集,我需要将此库安装为 jar(它不会从 gradle 编译)所以我需要它在 jar 中:(
    • dshirley 让我接手这个项目——我同意了,但实际上并没有发生——所以我怕我无能为力。如果很快没有任何事情发生,我将创建一个分叉。
    【解决方案3】:

    对我来说,解决方案是对每个模拟对象使用方法Mockito.mock(),而不是使用MockitoAnnotations.initMocks(this);

    例如:

    public class HomePresenterTest {
        private Repository repository;
        private HomePresenter presenter;
    
        @Before
        public void before() {
            repository = mock(Respository.class);
            presenter = new HomePresenter(repository);
        }
    
        //Your tests
    }
    

    【讨论】:

      【解决方案4】:

      我在那里创建了一个问题https://github.com/mockito/mockito/issues/392 带有修补程序的原始答案https://stackoverflow.com/a/36642606/1224247

      【讨论】:

        猜你喜欢
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 2017-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多