回答:
私はMockitoを使用して成功しています。
JMockとEasyMockについて学習してみたところ、学習曲線が少し急であることがわかりました(多分それは私だけです)。
Mockitoが好きなのは、その構文がシンプルでクリーンなので、すぐに理解できたからです。最小限の構文は一般的なケースを非常にうまくサポートするように設計されていますが、もっと複雑なことをする必要が何度かありましたが、私が欲しかったものがサポートされていて、簡単に理解できました。
以下は、Mockitoホームページの(簡略化した)例です。
import static org.mockito.Mockito.*;
List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();
それよりもずっと単純になるわけではありません。
私が考えることができる唯一の大きな欠点は、静的メソッドをモックしないことです。
私はPowerMockの作成者なので、明らかにお勧めします。:-)
PowerMockは、EasyMockとMockitoの両方を拡張し、静的メソッド、最終メソッド、さらにはプライベートメソッドをモックする機能を備えています。EasyMockのサポートは完全ですが、Mockitoプラグインにはさらに作業が必要です。JMockのサポートも追加する予定です。
PowerMockは他のフレームワークに置き換わるものではなく、他のフレームワークがモックを許可していないトリッキーな状況で使用できます。PowerMockには、静的初期化子やコンストラクターの抑制など、その他の便利な機能も含まれています。
JMockitのプロジェクトサイトは、現在のモックツールキットのための比較情報の多くが含まれています。
特に、EasyMock、jMock、Mockito、Unitils Mock、PowerMock、そしてもちろんJMockitをカバーする機能比較マトリックスを確認してください。できる限り正確かつ最新の状態に保つようにしています。
それはかなり新しいので、少し生で文書化されていません。これは、使用してASMを、それは静的な、プライベート、コンストラクタ、および静的初期化子を含むすべてのメソッドをモックすることができますので、動的にクラスのバイトコードを再定義します。例えば:
import mockit.Mockit;
...
Mockit.redefineMethods(MyClassWithStaticInit.class,
MyReplacementClass.class);
...
class MyReplacementClass {
public void $init() {...} // replace default constructor
public static void $clinit{...} // replace static initializer
public static void myStatic{...} // replace static method
// etc...
}
それは同様に記録/再生シナリオを可能にする期待インターフェイスを持っています:
import mockit.Expectations;
import org.testng.annotations.Test;
public class ExpecationsTest {
private MyClass obj;
@Test
public void testFoo() {
new Expectations(true) {
MyClass c;
{
obj = c;
invokeReturning(c.getFoo("foo", false), "bas");
}
};
assert "bas".equals(obj.getFoo("foo", false));
Expectations.assertSatisfied();
}
public static class MyClass {
public String getFoo(String str, boolean bool) {
if (bool) {
return "foo";
} else {
return "bar";
}
}
}
}
欠点は、Java 5/6が必要になることです。
また、Groovyを使用してテストを行うこともできます。Groovyでは、「as」演算子を使用してJavaインターフェースを簡単にモックできます。
def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest
これとは別に基本的な機能からGroovyは強力含めて、からかっ前面に、より多くを提供していますMockFor
し、StubFor
クラス。
EasyMockでモックを使い始めました。理解するのは簡単ですが、リプレイのステップはちょっと面倒でした。Mockitoはこれを削除し、読みやすさが主要な目標の1つであるように見えるため、構文も簡潔になっています。ほとんどの開発者は既存のコードを作成して作成するのではなく、読んで維持することに時間を費やすため、これがどれほど重要であるかを十分に強調することはできません。
もう1つの良い点は、EasyMockクラス拡張を使用することを覚えて(そしてチェックして)おく必要があるEasyMockとは異なり、インターフェイスと実装クラスが同じ方法で処理されることです。
私は最近JMockitをざっと見てみましたが、機能のランドリーリストはかなり包括的ですが、これの価格は結果のコードの読みやすさであり、さらに記述する必要があると思います。
私にとって、Mockitoはスイートスポットに到達し、書き込みと読み取りが簡単で、ほとんどのコードが必要とする状況の大部分を処理します。PowerMockでMockitoを使用するのが私の選択です。
考慮すべきことの1つは、自分で開発している場合、または小規模なチームで開発している場合に選択するツールは、さまざまなスキルレベルの開発者がいる大企業には最適ではない場合があることです。後者の場合は、読みやすさ、使いやすさ、シンプルさを考慮する必要があります。多くの人が最終的にモックフレームワークを使用しない、またはテストを維持しない場合、モックフレームワークを取得しても意味がありません。
私たちは職場でEasyMockとEasyMock Class Extensionを頻繁に使用しており、かなり満足しています。基本的に、必要なものはすべて揃っています。ドキュメントを見てください。EasyMockのすべての機能を示すとても良い例があります。
あなたは期待を設定できるので、私はJMockが好きです。これは、一部のモックライブラリでメソッドが呼び出されたかどうかを確認することとはまったく異なります。JMockを使用すると、非常に洗練された期待を書くことができます。jmock cheat-sheatを参照してください。
はい、Mockitoは優れたフレームワークです。私はそれをhamcrestおよびGoogle guiceと一緒に使用して、テストをセットアップします。
モックの最善の解決策は、マシンに自動化された仕様ベースのテストですべての作業を行わせることです。Javaについては、ScalaCheckおよびFunctional Javaライブラリーに含まれているReductioフレームワークを参照してください。自動化された仕様ベースのテストフレームワークでは、テスト対象のメソッドの仕様(trueである必要があるプロパティ)を指定すると、フレームワークがテストとモックオブジェクトを自動的に生成します。
たとえば、次のプロパティはMath.sqrtメソッドをテストして、正の数nの2乗の平方根がnに等しいかどうかを確認します。
val propSqrt = forAll { (n: Int) => (n >= 0) ==> scala.Math.sqrt(n*n) == n }
を呼び出すとpropSqrt.check()
、ScalaCheckは数百の整数を生成し、それぞれのプロパティをチェックします。また、エッジケースが適切にカバーされていることを自動的に確認します。
ScalaCheckはScalaで作成されており、Scalaコンパイラーが必要ですが、Javaコードを簡単にテストできます。Functional JavaのReductioフレームワークは、同じ概念の純粋なJava実装です。
Mockitoには、メソッドのスタブ、引数の照合(anyInt()やanyString()など)、呼び出し回数の検証(times(3)、atLeastOnce()、never())などのオプションもあります。
また、Mockitoはシンプルでクリーンであることもわかりました。
Mockitoについて私が気に入らない点の1つは、静的メソッドをスタブできないことです。