Javaに最適なモックフレームワークは何ですか?[閉まっている]


347

Javaでモックオブジェクトを作成するための最良のフレームワークは何ですか?どうして?各フレームワークの長所と短所は何ですか?

回答:


315

私はMockitoを使用して成功しています。

JMockとEasyMockについて学習してみたところ、学習曲線が少し急であることがわかりました(多分それは私だけです)。

Mockitoが好きなのは、その構文がシンプルでクリーンなので、すぐに理解できたからです。最小限の構文は一般的なケースを非常にうまくサポートするように設計されていますが、もっと複雑なことをする必要が何度かありましたが、私が欲しかったものがサポートされていて、簡単に理解できました。

以下は、Mockitoホームページの(簡略化した)例です。

import static org.mockito.Mockito.*;

List mockedList = mock(List.class);
mockedList.clear();
verify(mockedList).clear();

それよりもずっと単純になるわけではありません。

私が考えることができる唯一の大きな欠点は、静的メソッドをモックしないことです。


15
綺麗な。静的メソッドの場合は、MockitoとJMockitを組み合わせるだけで、テストできるほど「レガシー」なクラスはほとんどありません。
Epaga 2009年

6
すべきでないことを行おうとすると(モックをインラインで作成するなど)、例外メッセージで何が間違っていたかを非常に明確に説明できるのが気に入っています。
ripper234 2009年

3
私にとって、絶対に。無条件にお勧めします。もちろん、ニーズをよりよく満たす別のフレームワークを見つけた場合は、別の回答でそのフレームワークについて言及し、それが獲得する投票と、それが受け取るコメントの種類を確認してください。
ブライアンラフランボワーズ

2
@MexicanHackerなぜAndroidで使用できないのですか?私は今、Robolectricを使用しています。
Ilkka

2
Mockitoを使用していて、とても気に入っています。素晴らしいドキュメント(この品質のドキュメントを見つけるのは非常にまれで、作者からのよい仕事です)。これは、フレームワークのコードを掘り下げる必要がないものを使用するために非常に重要です!!!
Renato

84

私はPowerMockの作成者なので、明らかにお勧めします。:-)

PowerMockは、EasyMockとMockitoの両方を拡張し、静的メソッド、最終メソッド、さらにはプライベートメソッドをモックする機能を備えています。EasyMockのサポートは完全ですが、Mockitoプラグインにはさらに作業が必要です。JMockのサポートも追加する予定です。

PowerMockは他のフレームワークに置き換わるものではなく、他のフレームワークがモックを許可していないトリッキーな状況で使用できます。PowerMockには、静的初期化子やコンストラクターの抑制など、その他の便利な機能も含まれています。


Powermockは、ホストPCでネイティブJavaを使用してAndroidアプリケーションをユニットテストするために不可欠です(遅いエミュレーターの使用は避けてください)
Jeff Axelrod

@Jan唯一の問題は、私は@RunWith(PowerMockRunner.class)AND @RunWith(RobolectricTestRunner.class)やりたいのに:-( Robolectricを使用しているときPowerMockに互換性がないです
ブランデル

過去数か月間PowerMockを使用した後、心からお勧めします!
cwash

PowerMockは本当に素晴らしいです。私はすべてにアクセスするための静的なシングルトンが大好きです。これにより、テストが可能になります。
Ian Macalinao

警告:最終メソッドのモックのようないくつかのことは、PowerMockでのみ可能であり、Mockitoではできません。それほど頻繁に使用しないと、ちょっとした問題になります。なぜ何かがうまくいかないのかと思っていたところ、それがdocoのEasymockセクションにのみリストされていることに気付きました。
トラファルマドリアン2013

46

JMockitのプロジェクトサイトは、現在のモックツールキットのための比較情報の多くが含まれています。

特に、EasyMock、jMock、Mockito、Unitils Mock、PowerMock、そしてもちろんJMockitをカバーする機能比較マトリックスを確認してください。できる限り正確かつ最新の状態に保つようにしています。


1
私はJMockitに感銘を受けました。それはより急な学習曲線を持っていますが、何年にもわたって非常に優れたドキュメントがあり、あらゆるものをあざけることができます。私は学びやすいMockitoから始めましたが、解決できない問題に定期的に出会いました。一方、JMockitで不可能なことは想像もできません。
Hontváriレベンテ

21

私は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が必要になることです。


はい、本当にこれをお勧めします
Epaga '22

7
ただの更新:JMockitプロジェクトがcode.google.com/p/jmockitに移動しました。この投稿以降、LOTは進化しており(そして現在も進化しています)、現在は詳細なドキュメントがあります。
ホジェリオ

JMockitが再び移動しました。現在、Githubで入手できます。jmockit.github.io
Ravi Thapliyal

15

また、Groovyを使用してテストを行うこともできます。Groovyでは、「as」演算子を使用してJavaインターフェースを簡単にモックできます。

def request = [isUserInRole: { roleName -> roleName == "testRole"}] as HttpServletRequest 

これとは別に基本的な機能からGroovyは強力含めて、からかっ前面に、より多くを提供していますMockForし、StubForクラス。

http://docs.codehaus.org/display/GROOVY/Groovy+Mocks


13

EasyMockでモックを使い始めました。理解するのは簡単ですが、リプレイのステップはちょっと面倒でした。Mockitoはこれを削除し、読みやすさが主要な目標の1つであるように見えるため、構文も簡潔になっています。ほとんどの開発者は既存のコードを作成して作成するのではなく、読んで維持することに時間を費やすため、これがどれほど重要であるかを十分に強調することはできません。

もう1つの良い点は、EasyMockクラス拡張を使用することを覚えて(そしてチェックして)おく必要があるEasyMockとは異なり、インターフェイスと実装クラスが同じ方法で処理されることです。

私は最近JMockitをざっと見てましたが、機能のランドリーリストはかなり包括的ですが、これの価格は結果のコードの読みやすさであり、さらに記述する必要があると思います。

私にとって、Mockitoはスイートスポットに到達し、書き込みと読み取りが簡単で、ほとんどのコードが必要とする状況の大部分を処理します。PowerMockMockitoを使用するのが私の選択です。

考慮すべきことの1つは、自分で開発している場合、または小規模なチームで開発している場合に選択するツールは、さまざまなスキルレベルの開発者がいる大企業には最適ではない場合があることです。後者の場合は、読みやすさ、使いやすさ、シンプルさを考慮する必要があります。多くの人が最終的にモックフレームワークを使用しない、またはテストを維持しない場合、モックフレームワークを取得しても意味がありません。


1
+1この回答にはさらに投票が必要です。フレームワークについて、彼らが実際に好むか好まないかを共有する必要があります。「私はこれを使った。そして私はそれが好きだった!」このような良い質問がSOでクローズされる理由の1つです。
Ravi Thapliyal、2015

11

私たちは職場でEasyMockとEasyMock Class Extensionを頻繁に使用しており、かなり満足しています。基本的に、必要なものはすべて揃っています。ドキュメントを見てください。EasyMockのすべての機能を示すとても良い例があります。


1
私の質問では、モックフレームワークの好きなところと嫌いなところをもっと探していました。私はドキュメントを見つけてそれについてすべて読むことができます-私はそれを使用した人々がそれをどう思うか知りたいです。
ジョシュブラウン

EasyMockはJava 5以降でのみ機能します。
matt b

8

私は早くからJMockを使いました。私は最後のプロジェクトでMockitoを試してみましたが、気に入りました。より簡潔で、よりクリーン。PowerMockは、静的コードのモック、インスタンス作成のモック、最終クラスとメソッドのモックなど、Mockitoにはないすべてのニーズをカバーします。だから私は自分の仕事を実行するために必要なすべてを持っています。


6

あなたは期待を設定できるので、私はJMockが好きです。これは、一部のモックライブラリでメソッドが呼び出されたかどうかを確認することとはまったく異なります。JMockを使用すると、非常に洗練された期待を書くことができます。jmock cheat-sheatを参照してください。



4

モックの最善の解決策は、マシンに自動化された仕様ベースのテストですべての作業を行わせることです。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実装です。


3

Mockitoには、メソッドのスタブ、引数の照合(anyInt()やanyString()など)、呼び出し回数の検証(times(3)、atLeastOnce()、never())などのオプションもあります

また、Mockitoはシンプルでクリーンであることもわかりました。

Mockitoについて私が気に入らない点の1つは、静的メソッドをスタブできないことです。


この答えは不正確です。jMockとのインターフェースに限定されません。ClassImposteriserを使用して具象クラスを模擬できます。
テフロンテッド

EasyMockでもまったく同じことができます。
Cem Catikkas 2008

私は答えから不正確さを取り除いた。
Josh Brown

2

少し異なるものについては、JRubyMochaJtestRで組み合わせて使用して、Javaコードのテストを表現力豊かで簡潔なRubyで作成できます。ここに JtestRの便利なモックの例があります。このアプローチの利点の1つは、具象クラスのモックが非常に簡単であることです。


1

JMockでモックを使い始めましたが、最終的にEasyMockを使用するように移行しました。EasyMockはそれだけで-簡単-で、より自然に感じられる構文を提供しました。私はそれ以来切り替えていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.