私の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)
それを修正する方法はありますか?
@rjathの@MrChazの回答のコメントから、これは私にとってよりうまくいきます:
_System.setProperty(
"dexmaker.dexcache",
getInstrumentation().getTargetContext().getCacheDir().getPath());
_
setUp()
メソッドに入れます。
私はうまくいっているように見える修正をつなぎ合わせることができました。マニフェストに、読み取りと書き込みの外部ストレージを追加しました。テストにSystem.setProperty("dexmaker.dexcache", "/sdcard");
をテストに追加しました。エミュレータイメージにSDカードを追加しました。
デフォルトではmockitoがアプリのキャッシュディレクトリを使用しようとするため、これは機能すると思いますが、アクティビティを実行したことがないので、ディレクトリがOSによって作成されることはないと思います
したがって、問題は、DexmakerがAndroid> = 4.3でキャッシュパスを見つけられないこと、および このdexmakerの問題 で説明されているように4.3にある)ことです。
私は、すべてのテスト(またはそのスーパークラス)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
エントリがある場合は、それらを コマンドラインで に切り替えるか、IDE実行構成で1つ選択します。
Androidライブラリプロジェクトではこの問題が発生しましたが、アプリケーションプロジェクトでは発生しません!上記のようにシステムプロパティ "dexmaker.dexcache"を設定すると問題が回避されました。Android 4.3 Nexus 4デバイス、19.0.3ツールでビルド、ターゲットAPI 19、私の依存関係:
androidTestCompile "org.mockito:mockito-core:1.9.5"
androidTestCompile "com.google.dexmaker:dexmaker:1.0"
androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.0"
dexmakerプロジェクトが Google Code から GitHub に移動したようです。
Mavenセントラルリポジトリ には、2014年3月と2014年12月にバージョン1.1と1.2が公開されています。
この「dexcache == null」の問題がバージョン1.2まで存在することを確認しましたが、特定のデバイスでのみ発生します。たとえば、Android 5.0のGalaxy S5には問題があり、Android 4.4.2のGalaxy S4には問題がありません。
GitHubリポジトリのクローンを作成し( 2015年3月12日の最終コミット-ca74669 )、ローカルで実行し、問題を修正しました(これを裏付ける履歴にもコミットがあります)。 1.3リリースが出たら、この問題が完全になくなることを願っています。
1.3-SNAPSHOTのローカルコピーを実行したい人は誰でも、次のように実行します(Macでは、他のプラットフォームでも機能するため、mvn、adb、およびdxon[〜#〜] path [〜#〜] ):
git clone
https://github.com/crittercism/dexmaker.gitcd dexmaker
mvn install -Dmaven.test.skip=true
cp -R ~/.m2/repository/com/google/dexmaker $Android_HOME/extras/Android/m2repository/com/google
app/build.gradle
でバージョンを変更します:androidTestCompile 'com.google.dexmaker:dexmaker:1.3-SNAPSHOT'
pom.xml
、またはEclipse/antを使用している場合はlibs/dexmaker.jar
を~/.m2/repository/com/google/dexmaker/dexmaker/1.3-SNAPSHOT/dexmaker-1.3-SNAPSHOT.jar
で上書きしますまた、参考までに、Google Codeの同じ問題について 元の問題レポート もご覧ください。
代わりに、mockitoコアを依存関係として追加できます。そうすれば、そのエラーは発生せず、回避策は必要ありません。
dependencies {
...
testCompile 'org.mockito:mockito-core:1.10.19'
}
test
フォルダー内のリソースとフォルダーを操作すると、この問題が発生しました。実際には、再起動するだけでAndroid Studioは役に立ちました。シンプルですが、機能しました。