12

これは、JMockItを最初に使用したときに見つけたものです。JMockItのドキュメントは、それが提供するものについて非常に簡潔であることがわかったため、何かを見逃した可能性があることを認めなければなりません。それにもかかわらず、これは私が理解したことです:

Mockito: List a = mock(ArrayList.class) does not stub out all methods
of List.class by default. a.add("foo") is going to do the usual thing
of adding the element to the list.

JMockIt: @Mocked ArrayList<String> a;
It stubs out all the methods of a by default. So, now a.add("foo")
is not going to work.

This seems like a very big limitation to me in JMockIt.
How do I express the fact that I only want you to give me statistics
of add() method and not replace the function implementation itself
What if I just want JMockIt to count the number of times method  add()
was called, but leave the implementation of add() as is?

I a unable to express this in JMockIt. However, it seems I can do this
in Mockito using spy()

私は本当にここで間違っていると証明されたいです。JMockitは、他のモックフレームワークが実行するすべての機能に加えて、さらに多くの機能を実行できると主張しています。ここではそうではないようです

@Test
public void shouldPersistRecalculatedArticle()
{
  Article articleOne = new Article();
  Article articleTwo = new Article();

  when(mockCalculator.countNumberOfRelatedArticles(articleOne)).thenReturn(1);
  when(mockCalculator.countNumberOfRelatedArticles(articleTwo)).thenReturn(12);
  when(mockDatabase.getArticlesFor("Guardian")).thenReturn(asList(articleOne, articleTwo));

  articleManager.updateRelatedArticlesCounters("Guardian");

  InOrder inOrder = inOrder(mockDatabase, mockCalculator);
  inOrder.verify(mockCalculator).countNumberOfRelatedArticles(isA(Article.class));
  inOrder.verify(mockDatabase, times(2)).save((Article) notNull());
}



@Test
public void shouldPersistRecalculatedArticle()
{
  final Article articleOne = new Article();
  final Article articleTwo = new Article();

  new Expectations() {{
     mockCalculator.countNumberOfRelatedArticles(articleOne); result = 1;
     mockCalculator.countNumberOfRelatedArticles(articleTwo); result = 12;
     mockDatabase.getArticlesFor("Guardian"); result = asList(articleOne, articleTwo);
  }};

  articleManager.updateRelatedArticlesCounters("Guardian");

  new VerificationsInOrder(2) {{
     mockCalculator.countNumberOfRelatedArticles(withInstanceOf(Article.class));
     mockDatabase.save((Article) withNotNull());
  }};
}

このような声明

inOrder.verify(mockDatabase, times(2)).save((Article) notNull());

上記の例からわかるように、MockitoではJMockItに同等のものはありません

new NonStrictExpectations(Foo.class, Bar.class, zooObj)
{
    {
        // don't call zooObj.method1() here
        // Otherwise it will get stubbed out
    }
};


new Verifications()
{
    {
        zooObj.method1(); times = N;
    }
};
4

2 に答える 2

11

実際、すべてのモック API は、デフォルトで、モックされた型のすべてのメソッドをモックまたはスタブ化します。mock(type)(「完全な」モッキング)とspy(obj)部分的なモッキング)を混同したと思います。

JMockit は、すべてのケースでシンプルな API を使用してこれらすべてを行います。JMockit チュートリアルに、例を含めてすべて説明されています。証拠として、サンプル テスト スイート(ツールキットの新しいリリースから削除されたものは他にもたくさんありますが、古い zip ファイルにはまだあります)、または多くの JMockit 統合テスト (現在1,000以上) を見ることができます。 .

Mockito に相当するのspyは、JMockit の「動的部分モッキング」です。部分的にモックしたいインスタンスを引数としてExpectationsコンストラクターに渡すだけです。期待値が記録されていない場合、テスト対象のコードが実行されると、実際のコードが実行されます。ところで、Mockito には深刻な問題があります (JMockit にはありません)。これは、 or内で呼び出された場合でも、常に実際のコードを実行するためです。このため、人々はスパイされたオブジェクトの驚きを避けるために使用する必要があります.when(...)verify(...)doReturn(...).when(...)

呼び出しの検証に関しては、JMockit Verifications API は他の API よりもかなり優れています。例えば:

new VerificationsInOrder() {{
    // preceding invocations, if any
    mockDatabase.save((Article) withNotNull()); times = 2;
    // later invocations, if any
}};
于 2011-10-26T18:02:37.470 に答える
6

Mockito は JMockIT よりもはるかに古いライブラリであるため、より多くの機能を備えていることが期待できます。十分に文書化されていない機能のいくつかを確認したい場合は、リリース リストを読んでください。JMockIT の作成者は、他のフレームワークが行っていないことをすべて見逃し、いくつかの間違いを犯した機能のマトリックスを作成しました (たとえば、Mockito は厳密なモックと順序付けを行うことができます)。

Mockito は、ユニットレベルの BDD を有効にするためにも作成されました。これは一般的に、テストがコードの使用方法の良い例を提供し、コードが素敵で分離され、適切に設計されている場合、JMockIT が提供するすべての悪ふざけは必要ないことを意味します。オープン ソースで行うのが最も難しいことの 1 つは、長期的には役に立たない多くの要求に対して「ノー」と言うことです。

MockitoJMockITのフロント ページの例を比較して、実際の違いを確認してください。何をテストするかではなく、テストがクラスの動作をどれだけうまく文書化して説明するかです。

関心の宣言: Szczepan と私は、彼が Mockito の最初のドラフトを書いたとき、同じプロジェクトに参加していました。当時の既存のモッキング フレームワークを使用するのではなく、独自のスタブ クラスをロールアウトする私たちを見た後です。だから私は彼が私のためにそれをすべて書いたように感じ、完全に偏っています. ありがとうシュチェパン。

于 2011-10-10T18:59:20.007 に答える