在Mockito java中断言方法调用参数的最新更好的方法?

在Mockito java中断言方法调用参数的最新更好的方法?,java,unit-testing,mockito,assertions,Java,Unit Testing,Mockito,Assertions,现在,为了测试我的模拟服务方法调用参数,我使用了以下技术,有没有更好或最新的方法可以做到这一点 @Test public void testSendOutBidNotificationWhenCurrentBidderIsNotNullAndDifferentThenUserWithBidDifferenceNonZero(){ Event event = new Event(); event.setCurrency(Currency.USD); Item item =

现在,为了测试我的模拟服务方法调用参数,我使用了以下技术,有没有更好或最新的方法可以做到这一点

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

    User currentHighBidder = new User("high@high.com", 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());

}
@测试
public void testsendoutBidNotificationwhen currentBidDerinsNotNullandDifferentintTheUserwithBidDifferenticeNonzero(){
事件=新事件();
事件.设置货币(货币.美元);
项目=新项目();
项目.设置代码(“TST”);
用户=新用户(“current@current.com“,88888888升);
用户CurrentHighBider=新用户(“high@high.com“,9999999999升);
项目。setCurrentHighBidder(currentHighBidder);
doReturn(10).when(itemService).getBidIncrement(any(),any());
ArgumentCaptor textMessageCaptor=ArgumentCaptor.forClass(TextMessage.class);
textMessagePrepareService.SendotBidNotification(事件、项目、用户、20、当前高价竞标者);
验证(textMessageService).sendText(textMessageCaptor.capture());
assertEquals(“您对物品TST出价过高。新出价为20美元,因此您需要出价高于该出价10美元才能赢得该物品。例如:TST$30”,
textMessageCaptor.getValue().getMessage());
}
在这里,我捕获了TextMessage,它将用作sendText方法中的参数,并测试了先前构造的值

测试方法如下所示

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();
        }
    }
}
public void sendotBidNotification(事件事件、项目项、用户用户、int bidAmount、用户currentHighBider){
如果(CurrentHighBider!=null&&!CurrentHighBider.equals(用户)){
日志信息(“出价高于者不同:+CurrentHighbider”);
试一试{
int bidiincrement=itemService.getbidiincrement(item,eventService.getAuction(event));
Map params=新的HashMap();
参数put(“增量”,String.valueOf(bidIncrement));
参数put(“必需”,字符串值of(bidAmount+bidIncrement));
参数put(“金额”,String.valueOf(bidAmount));
参数put(“item_code”,item.getCode());
参数put(“currency_symbol”,event.getCurrency().getSymbol());
String loserMessage=this.getLooserOutBidNotificationMessage(bidIncrement,params);
TextMessage TextMessage=new TextMessage(loserMessage,event.getAePhoneNumber(),currentHighbider,loserMessage);
textMessage.sendText(textMessage);
}捕获(例外e){
日志错误(“发生异常:+e”);
e、 printStackTrace();
}
}
}

有一个更好的方法:不要使用
new
来创建文本消息。相反,要有一个为您创建消息的工厂;并使用依赖注入将工厂放在类中进行测试

因为这样您就可以控制调用该方法时使用的TextMessage对象了!意思是:你可以模拟这个工厂,让它返回一个“已知”的TextMessage对象。现在,您只需要验证是否使用对象调用了服务。这允许你只做一个简单的参数匹配;你可以完全摆脱ArgumentCaptor和它的断言


那真的很好;as:对消息的文本执行assertEquals()是一种不好的做法。这些信息一直在变化;当人们发现更改包含消息文本的某个资源包的内容会破坏单元测试时,他们会很快感到恼火。

您所做的一切都很好。如果要避免使用
参数捕获器
,可以编写一个
匹配器
,对其参数调用
getMessage
,但这真的没什么意义。好吧,我把我的消息生成器移到了另一个实用程序基础组件上,它给了我loserMessage,所以现在我可以在该类中测试该逻辑,并在该类中模拟它,因为我的基本动机是测试loserMessage。如果你的评论应该说:“你的答案有帮助”,那么请随意接受我的回答;-)