サードパーティのライブラリ(Twitter4j)を使用してAndroidアプリケーションを開発しています。JUnitおよび機能テストでこれらのオブジェクト(私が作成したオブジェクトも)をモックできるようにしたいです。
いくつかのモックライブラリを使用した良い経験があり、それらを推奨できますか?
(更新:Mockitoはバージョン1.9.5からAndroidサポートを追加し、EasyMockはバージョン1.9.5からAndroidサポートを追加しました3.2実行時にコードを生成するビットを除外し、プラグイン可能にすることによって、たとえばcglibの代わりにdexmakerを使用することによって。)
DixonD(かなり若い、証明されていないライブラリ)によって言及された Android-mock を除いて、現在解決策はありません。 CGLibはバイトコードの生成に依存し、Dalvikでは機能しないため( Mockito 、プレーン EasyMock )、CGLibに基づくものはすぐに忘れることができます(=にも依存します) Java Beansパッケージ。これもAndroidの一部ではありません)。
価値のあるものとして、Android( MockContext など)に付属するごく少数のモッククラスを使用できますが、動作を検証せず、単なるスタブです。デフォルトの動作では、すべてのメソッドでランタイムエラーがスローされるため、それらをサブクラス化して、モックするメソッドをオーバーライドする必要があります。
ただし、インストルメンテーション以外のテスト、つまりJVMで実行される標準の単体テストでモックライブラリを使用することはできます。 PowerMock を使用してフレームワークメソッドをモックできます。静的メソッドとコンストラクターのモックをサポートしているため、モックは次のように強力になります。 in Ruby(使用するのがもっと面倒です)。
JUnit 4 + PowerMock + Mockitoを使用し、すべての通常のJUnitテストを継承する基本クラスでContextやTextUtilsなどのクラスをモックアウトします。インストルメンテーションテストでは、カスタムモッククラスを作成し、実行時にインスタンス化する実装(モックかどうか)をファクトリを使用して決定します。
私は最近、Androidで動作するネイティブScalaモックフレームワークであるBorachioをリリースしました。
BorachioはScalaで記述されているため、テストはScalaで記述する必要があります。ただし、Javaで記述されたコードをテストするために使用できます。
私のブログのAndroid)でBorachioを使用する方法の説明があります:
http://www.paulbutcher.com/2011/03/mock-objects-on-Android-with-borachio-part-1/ http://www.paulbutcher.com/2011/03/mock-objects-on-Android-with-borachio-part-2/ http://www.paulbutcher.com/2011/03/mock-objects-on-Android-with-borachio-part-3 /
Borachioは現在 ScalaMock です。
Robolectric は別のアプローチを使用します。 DVMで実行する代わりに、Android SDKを「デファング」して、JUnit4フレームワークを使用してJVMで直接Androidテストを実行できるようにします。ビルドと実行がはるかに高速になり、モックが少なくて済みます。
[一般的なアプローチ]は、MockitoやAndroid Mockを使用してAndroid SDKをモックアウトするなどのモックフレームワークを使用することです。これは有効なアプローチですが、 Robolectricがないと、Androidアプリをテストするために必要なモックのレベルは、アプリケーションコードの本質的に逆の実装であるテストをすばやく生成することがわかりました。
Robolectricを使用すると、ブラックボックステストに近いテストスタイルが可能になり、リファクタリングにテストがより効果的になり、Androidの実装ではなくアプリケーションの動作にテストを集中させることができます。必要に応じて、Robolectricと一緒にモックフレームワークを使用することもできます。
仕組みは次のとおりです。
[インターセプト] Androidクラスの読み込みとメソッド本体の書き換え。RobolectricはAndroidメソッドを再定義して、null(または0、false、など)、または提供されている場合、Robolectricはメソッド呼び出しをshadow Androidオブジェクトに転送してAndroid SDKの動作を提供します。
更新:easymock 3.2がcglibの代替プラグインのオプションを追加したようです。
Easymock 2.5.2を使用しています(注-3.Xは使用しないでください)。それは機能します-しかしモックインターフェースに対してのみ。
したがって、ライブラリがインターフェイスを公開している場合、または依存関係をインターフェイスでラップする場合は、easymockを使用できます。
Easymock 3.xなどのそれ以降のeasymockバージョンは、Androidと互換性のない cglib をバイトコード操作に使用するため、機能しませんクラスとインターフェイスの両方。2.xはクラスのモックにのみ使用します。
Android Mock は EasyMock 2.4 の上に書かれています。これはJavaのよく知られたモックフレームワークです。
LmockはAndroid: github.com/vmware/lmock
Android-Mockを試しました。これまでのところ非常にうまく機能しています。それは私の問題を解決しました(EasyMockなしでAndroidTestCaseを使用するか、EasyMockを使用しますがコンテキストは許可されません)