我正在尝试在我的Android项目中使用Mockito。我找到了处理它的非常好的教程:http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/
基本上,它使用了新版本的Mockito + Dexmaker,一切都像预期的那样工作。
然而,当我试图模拟一些Android特定的对象时,即:
Context context = mock(Context.class);我收到此异常:
java.lang.IllegalArgumentException:
dexcache == null (and no default could be found;
consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)你知道怎么修复它吗?
发布于 2014-03-14 18:37:00
从@rjath对@MrChaz的回答的评论来看,这对我来说更好:
System.setProperty(
"dexmaker.dexcache",
getInstrumentation().getTargetContext().getCacheDir().getPath());我把它放在我的setUp()方法中。
发布于 2012-10-02 01:27:17
我设法拼凑了一个似乎对我有效的修复方法。在清单中,我添加了读写外部存储。在测试中,我将System.setProperty("dexmaker.dexcache", "/sdcard");添加到测试中。在模拟器镜像中,我添加了一张SD卡。
我相信这是可行的,因为默认情况下mockito会尝试使用应用程序缓存目录,但我从未运行过活动,因此我怀疑该目录从未由操作系统创建
发布于 2014-05-23 16:54:09
所以问题出在Dexmaker不能像其他人提到的那样在安卓>= 4.3上找到缓存路径,也不能像this dexmaker issue中描述的那样。
我采用了在自定义测试运行器中实现变通方法,而不是在每个测试(或它们的超类) setUp()中实现,因为它感觉不那么麻烦(它实际上只在一个地方-并且不是在每个子类中继承),并且更灵活。为了便于文档记录,以下是完成此操作所需的更改:
public class CustomInstrumentationTestRunner extends InstrumentationTestRunner {
@Override public void onCreate (final Bundle arguments) {
super.onCreate(arguments);
// temporary workaround for an incompatibility in current dexmaker (1.1) implementation and Android >= 4.3
// cf. https://code.google.com/p/dexmaker/issues/detail?id=2 for details
System.setProperty("dexmaker.dexcache", getTargetContext().getCacheDir().toString());
}
}并设置您的项目(或测试项目),以便在使用ant进行构建时,在其AndroidManifest.xml中使用此类作为仪表化的测试运行器:
<instrumentation
android:name="my.package.CustomInstrumentationTestRunner"
android:targetPackage="my.target.package" />或者使用gradle构建时的build.gradle:
android {
defaultConfig {
// ...
testInstrumentationRunner 'my.package.CustomInstrumentationTestRunner'
}
// ...
}如果您有其他instrumentation条目,则可以在它们之间进行切换,或者在on the command line运行配置中选择一个条目。
https://stackoverflow.com/questions/12267572
复制相似问题