2016-10-11 7 views
1

私は、「テストによって導かれるオブジェクト指向ソフトウェアの成長」という本を取り上げています。AssertJとMockito:やや複雑なJTableイベントをチェックしますか?

しかし私は、HamcrestとjMockの代わりにAssertJとMockitoを使用しています。

私はこれまで、JTableの行0に関連付けられた1つ以上のテーブルイベントの発生をチェックする必要がありました。

// verify that one or more events in row 0 happen 
    verify(listener, atLeastOnce()).tableChanged(refEq(new TableModelEvent(model, 0))); 

(NB私は親切に数日前Mureinik hererefEqを知らされました)。

TableModelEvent.UPDATEタイプの0行目に正確に1つのTableModelEventが存在することを確認する必要があります。本の内容は次のとおりです。

... aChangeInRowはjMockから来ているようです。

NB TableModelEventは有用な方法getType()を持っています。ここに私が書いてみたいことがあります:

// verify that precisely one ***change*** event happens in row 0 
    // *** CAVEAT: ERRONEOUS CODE *** 
    verify(listener).tableChanged(refEq(new TableModelEvent(model, 0))).getType().isEqualTo(TableModelEvent.UPDATE); 

しかし、これはコンパイルされません...私は何を書かなければならないのですか?

もっと一般的には、検証されたメソッドにパラメータとして渡された値(ここではTableModelEvent)を抽出して任意のテストに従わせるためのAssertJ/Mockitoテクニックがありますか?

答えて

0

ハムクレストを使用したくない場合getTypeメソッドの結果に非常に似合う独自のマッチャーを作成する必要があります。

ArgumentMatcher<RockData> checkTypeMatcher = new ArgumentMatcher<TableModelEvent>() { 


public boolean matches(Object arg0) { 
    //put more logic here 
    TableModelEvent event = (TableModelEvent) arg0; 
    return event.getType() == TableModelEvent.UPDATE; 
} 
}; 

verify(listener).tableChanged(Mockito.argThat(checkTypeMatcher)); 

UPDATE:ArgumentMatcherフォームを使用します。Mockito。

ArgumentMatcherクラスはMockitoに由来します。

+0

ありがとう...(私が誤解していない限り)MatcherとBaseMatcherは実際にHamcrestクラスです。ハムクレストフリーのソリューションは存在しないかもしれません(私はこの時点ではテスト用のnewbが多すぎるので質問しています)。しかし、もしそうなら、私はかなり驚いています... –

+0

しかし、あなたはArgumentMatcherクラスを使うことができますMockito。上記の私の更新を参照してください。 –

+0

本当にありがとう...私には、AssertJの "流暢な"精神の中でより多くのAssertJ技法がないかもしれないかどうか疑問に思っていますか?私の考えでは(私が言うように、私はnewbです)、私の他の問題と結びつくことはありません。あなたの解決策では、このアップデートが発生した行番号もチェックしません。 2つのAssertJメソッドを一緒に「ストリング」することによって、おそらく両方を行うソリューションです。 –

0

Mockito APIはHamcrestマッチャーで動作します。あなたはそれらにこだわる必要があります。

私は実際にAssertJマッチャーを主張する点はありませんが、本当に望むなら、ArgumentCaptorをキャプチャしてAssertJを使用することができます。

ArgumentCaptor<TableModelEvent> cap = ArgumentCaptor.forClass(TableModelEvent.class); 
verify(listener).tableChanged(cap.capture()); 

TableModelEvent value = cap.getValue(); 
assertThat(value).isNotNull(); 
+0

ありがとう...それは、私がこれらの異なるフレームワークすべてを使ってテストnewbとしてかなり混乱していることです。私はTDDに関するいくつかの本を読んだことがあります。まず、AssertJの見やすい可読性、AssertJメソッドの "流暢な"(つまりそれらを一緒にした)文字、そして第3に相反する問題が報告されていますHamcrestのバージョンJUnitは、あなたがGradleを使用するとき、特定のHamcrestにバンドルされています)...しかし、私がHamcrestに慣れなければならない場合は、そうしてください! –

関連する問題