Robolectric = Mockito:无法在Mockito创建模拟或间谍因为:dexcache == null

时间:2016-05-13 17:19:45

标签: android unit-testing mockito robolectric robolectric-gradle-plugin

我在这里有一个很好的报道问题:

Mockito + Dexmaker on Android

但是解决方案不起作用。

我正在使用Robolectric,甚至当我尝试设置dexmaker缓存位置时:

@Before
public void setUp()
{
    System.setProperty("dexmaker.dexcache", RuntimeEnvironment.application.getCacheDir().getPath());
}

错误更改为

java.lang.RuntimeException:java.lang.NullPointerException

at com.android.dx.DexMaker.generateClassLoader(DexMaker.java:366)
at com.android.dx.DexMaker.generateAndLoad(DexMaker.java:439)
at com.android.dx.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:264)
at com.android.dx.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:56)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
at org.mockito.Mockito.spy(Mockito.java:1368)

您是否有任何想法可以让我使用Robolectric创建Mock或Spy对象?

注意:当我不使用Robolectric并使用常规ActivityInstrumentationTestCase2@RunWith(AndroidJUnit4.class)时,我可以创建Mock和Spy对象......

这个问题出现在Mockito 1.9之后

2 个答案:

答案 0 :(得分:1)

我刚刚发现了这个解决方法:

https://comadeblog.wordpress.com/2013/11/12/dexcachenull-for-mockito-on-robolectric/comment-page-1/

TL; DR:

使用compile 'org.mockito:mockito-core:1.9.0'。更高版本会抛出此错误。

这是我发现使用Robolectric的唯一方法。

答案 1 :(得分:1)

Robolectric用于在构建机器JVM上运行的单元测试。您不需要 Dexmaker 来进行这些测试。

因此,请更正您的build.gradle

androidTestCompile "com.crittercism.dexmaker:dexmaker:${versions.dexmaker}"
androidTestCompile "com.crittercism.dexmaker:dexmaker-dx:${versions.dexmaker}"
androidTestCompile "com.crittercism.dexmaker:dexmaker-mockito:${versions.dexmaker}"