2017-04-08 10 views
-1

私は以下のテクニックを使用して、自分のモックサービスメソッドの呼び出しパラメータをテストします。これを行うには、より良い方法や最新の方法がありますか?Mockito javaのメソッド呼び出しパラメータをアサートする最新かつより良い方法は?

@Test 
public void testSendOutBidNotificationWhenCurrentBidderIsNotNullAndDifferentThenUserWithBidDifferenceNonZero(){ 
    Event event = new Event(); 
    event.setCurrency(Currency.USD); 
    Item item = new Item(); 
    item.setCode("TST"); 
    User user = new User("[email protected]", 8888888888L); 

    User currentHighBidder = new User("[email protected]", 9999999999L); 
    item.setCurrentHighBidder(currentHighBidder); 

    doReturn(10).when(itemService).getBidIncrement(any(), any()); 

    ArgumentCaptor<TextMessage> textMessageCaptor = ArgumentCaptor.forClass(TextMessage.class); 
    textMessagePrepareService.sendOutBidNotification(event, item, user, 20, currentHighBidder); 

    verify(textMessageService).sendText(textMessageCaptor.capture()); 
    assertEquals("You have been outbid for item TST. The new bid is $20, so you need to bid $10 more than that to win the item. For example: TST$30", 
        textMessageCaptor.getValue().getMessage()); 

} 

ここでは、sendTextメソッドのパラメータとして使用されるTextMessageをキャプチャし、以前に構築される値をテストします。テスト中の

方法は

public void sendOutBidNotification(Event event, Item item, User user, int bidAmount, User currentHighBidder){ 
    if (currentHighBidder != null && !currentHighBidder.equals(user)) { 
     log.info("Outbid person different: " + currentHighBidder); 
     try { 
      int bidIncrement = itemService.getBidIncrement(item, eventService.getAuction(event)); 

      Map<String, String> params = new HashMap<String, String>(); 
      params.put("increment", String.valueOf(bidIncrement)); 
      params.put("required", String.valueOf(bidAmount + bidIncrement)); 
      params.put("amount", String.valueOf(bidAmount)); 
      params.put("item_code", item.getCode()); 
      params.put("currency_symbol", event.getCurrency().getSymbol()); 

      String loserMessage = this.getLooserOutBidNotificationMessage(bidIncrement, params); 

      TextMessage textMessage = new TextMessage(loserMessage, event.getAePhoneNumber(), currentHighBidder, loserMessage); 
      textMessageService.sendText(textMessage); 
     } catch (Exception e) { 
      log.error("Exception Occurred : " + e); 
      e.printStackTrace(); 
     } 
    } 
} 
+0

あなたがやっていることは、まったく問題ありません。 'ArgumentCaptor'の使用を避けたいのであれば、その引数に' getMessage'を呼び出す 'Matcher'を書くことができますが、実際には何の意味もありません。 –

答えて

1

良い方法があります以下の通りです:それのTextMessageを作成するためにnewを使用しないでください。代わりに、工場があなたのためにメッセージを作成します。依存関係の注入を使用してテスト中のクラスにそのファクトリを置きます。

コントロールを取得すると、そのメソッドが呼び出されたときに使用されるTextMessageオブジェクトが上書きされます。意味:あなたはそのファクトリをモックし、 "既知の" TextMessageオブジェクトを返すことができます。そして、あなたのサービスがというオブジェクトで呼び出されたことを確認するだけです。これにより、単純に引数を一致させることができます。あなたはそのArgumentCaptorとその上のアサーションを完全に取り除くことができます!

それは本当に良いでしょう。次のように:assertEquals()を実行するとというテキストのメッセージは悪い習慣です。これらのメッセージは常に変化します。メッセージテキストを含むリソースバンドルの内容を変更するとユニットテストが中断されることがわかった場合、人々はすぐに迷惑をかけることになります。

+0

ok代わりに私のメッセージジェネレータをloserMessageを与える別のユーティリティベースコンポーネントに移動しました。そのクラス内でそのロジックをテストして、このクラスのモックにすることができます。 –

+1

あなたのコメントが「あなたの答えが助けになった」と言われたら、私の答えを受け入れるよう気軽に;-) – GhostCat

関連する問題