12

AndroidAPIのいくつかのものを使用するJavaライブラリがあります。Mockitoを使用して、このライブラリの単体テストを作成したいと思います。

これについて私が行くことができる方法はありますか?

MockitoはDalvikVMではうまく機能しません。この投稿を参照してください:Android仮想マシンでのMockitoの使用

アップデート:

この投稿以来、私はRobolectricを発見し、Pivo​​tal Labsで作業して、このライブラリに少し貢献する機会がありました。Androidテストフレームワーク/mockitoよりもこれを使用することをお勧めします。また、Robolectric AND Mockitoは自由に使用できますが、Robolectricのシャドウオブジェクトにより、ほとんどのユースケースでMockitoは不要になります。

Androidの単体テストを試みる際の問題は、構築するAndroidライブラリに、スタブ例外をスローするかnullを返すためにすべてのメソッドがスタブアウトされていることです。アプリをテストしてAndroidの動作を確認したい場合は、クラスの読み込み時にバイトコードをその場で書き換え、動作をシミュレートするシャドウオブジェクトを挿入するRobolectricを使用しない限り、運が悪いことになります。

更新2:

久しぶりに状況が変わりました。RobolectricのShadowクラスの多くは、実際のAndroidクラスに置き換えられました。現在、実際のAndroid jarが使用されており、Robolectricは、はるかに小さなセットのシャドウクラスのみをロードします。これは、AndroidのテストにRobolectricを使用する理由の1つです。

4

4 に答える 4

9

多くのグーグルの後、私はここでこれに対する答えに出くわしました。

基本的には、Androidクラスの読み込みをインターセプトするRobolectricユニットテストフレームワークを使用する必要があります。次に、Mockitoを使用して(ほとんどの場合は必要ありませんが)、JVMでテストを実行できます。

于 2011-11-17T01:43:26.887 に答える
2

バージョン1.9.5(2012年6月3日リリース)以降、AndroidでMockitoを使用できます。これを行うには、dexmakerも必要になります。

http://code.google.com/p/dexmaker/

このwikiページでは、それを実装する方法について説明しています。

http://code.google.com/p/dexmaker/wiki/Mockito

于 2012-06-19T12:01:07.007 に答える
1

android-mockを見てください。EasyMock 2.4に基づいています(Mockitoほど良くはありませんが、近いです)。

DalvikVMの制限を回避するには、実行時ではなくビルド時にモッククラスを事前に生成し、デバイスにデプロイするときにコンパイル済みのテストコードをバンドルします。

Borachioと呼ばれるモックフレームワークもありますが、これは保証できませんが、有望に見えます(Scalaをデバイスで実行する動作に満足している場合)。

于 2011-11-11T00:09:10.847 に答える
1

Android SDKの内部クラスとは何の関係もないため、これを回避できます。それが私のAndroidプロジェクトで行っていることです(私は使用していますJMock2が、ではありませんMockito)。

2つのテストプロジェクトがあります。

  • 最初のものは使用JUnit4し、JMock2依存関係として自分自身を追加しました。すべての「ビジネスロジック」クラスをテストしますが、Androidに関係するもの(UIクラス、SQLiteOpenHelperなど)をテストできません。テストでそれらを使用しようとすると、恐ろしいStub!例外が発生します。

  • ActivityInstrumentationTestCase22つ目は、とを使用してUIをテストしRobotiumます。

それは大変な作業で複雑に思えるかもしれませんが、実際にはそうではなく、実際にはそれらを分離する方が良いと思います。UIテストは「実際の」単体テストではなく、多くの場合、複数のユニットにわたっていくつかの機能をテストします。UIレイヤーをビジネスロジックから適切に分離する場合(そして、このテストの分離を行うと、TDDスタイルでそれを行う必要があります)、それはすべて素晴らしくスムーズです。

于 2011-11-12T23:34:24.547 に答える