Java 用mockito测试一个方法,它使用其他类的一些实用方法

Java 用mockito测试一个方法,它使用其他类的一些实用方法,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我有一个从队列接收消息的方法,我需要用Mockito为这个方法编写单元测试。该方法使用实用程序类UtillClass。我不知道如何为这种方法编写单元测试 public boolean findSomeRecord(Message<?> message){ Details details = UtilClass.getHeaderValue(Constants.DETAILS, message, Details.class); Record record = reco

我有一个从队列接收消息的方法,我需要用Mockito为这个方法编写单元测试。该方法使用实用程序类UtillClass。我不知道如何为这种方法编写单元测试

public boolean findSomeRecord(Message<?> message){
    Details details = UtilClass.getHeaderValue(Constants.DETAILS, message, Details.class);

    Record record = recordService.findById(details.getDetailsId());

    if(record == null ){
        return false;
    }
    return true;
}
public boolean findSomeRecord(消息){
Details Details=UtilClass.getHeaderValue(Constants.Details、message、Details.class);
Record Record=recordService.findById(details.getDetailsId());
if(记录==null){
返回false;
}
返回true;
}
答案:视情况而定

我猜您的第一个问题是,这个静态方法调用
UtilClass.getHeaderValue()
在单元测试中不能正常工作

你看,因为如果它能起作用。。。你会在乎什么?意思:您想测试
findSomeRecord()
是否返回true或false。因此,在完美的设置中,您只有两个测试,如:

assertThat(objectUnderTest.findSomeRecord(someRecordThatCanBeFound), is(true));
分别

但在单元测试设置中,静态方法可能无法以这种方式工作。那么你有两个选择:

  • 你转向PowerMock(ito);它允许您模拟静态方法
  • 你改变了你的设计;例如,给出了一个想法,即这个util方法是一个静态的方法。因为当您不调用静态方法时,您可以(几乎)始终使用依赖项注入为生产代码提供一个模拟的对象来调用其方法

  • 到目前为止你写了什么?我可以在单元测试中模拟UtilClass吗@Jobin在不模拟静态调用的情况下,您可以编写测试。。您不需要模拟util类,只需模拟recordService.findById,实际上我不能更改使用UtilClass静态方法的生产方法的设计,也不能使用PowerMOck,因为我只能使用MockIto,因此没有人可以帮助您。然后,您的需求对您的约束如此之大,以至于无法进行合理的测试。或者更准确地说:这取决于您是否至少可以为您的方法提供一个模拟的recordService对象。如果调用getHeaderValue()确实返回了一些东西,那么您仍然很好。这是有道理的。。谢谢你实际上你最后的评论很快解决了我面临的问题
    assertThat(objectUnderTest.findSomeRecord(someRecordThatCanNotBeFound), is(false));