【问题标题】:Test a method with mockito, which uses some utility methods of some other class使用 mockito 测试一个方法,该方法使用其他类的一些实用方法
【发布时间】:2016-12-28 07:07:26
【问题描述】:

我有一个从队列接收消息的方法,我需要使用 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;
}

【问题讨论】:

  • 到目前为止你写了什么?
  • 我可以在单元测试中模拟 UtilClass 吗? @Jobin
  • 无需模拟静态调用,您可以编写测试。您不需要模拟 util 类,只需模拟 recordService.findById

标签: java unit-testing junit mockito


【解决方案1】:

答案:它取决于

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

你看,因为如果它会起作用......你会关心它什么?含义:您想测试findSomeRecord() 返回真或假。因此,在完美设置中,您将只有两个测试,例如:

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

分别

assertThat(objectUnderTest.findSomeRecord(someRecordThatCanNotBeFound), is(false));

但可能 static 方法在您的单元测试设置中不起作用。那么你有两个选择:

  1. 您转向 PowerMock(ito);它允许您模拟静态方法
  2. 您更改了设计;例如,放弃这个 util 方法是一个 静态 方法的想法。因为当你不调用静态方法时,你可以(几乎)总是使用依赖注入来给你的生产代码一个mocked对象来调用它的方法。李>

【讨论】:

  • 其实我不能改变使用UtilClass的静态方法的生产方法的设计,也不能使用PowerMOck,因为我只能使用Mockito
  • 那么没有人可以帮助你。然后,您的要求对您造成了很大的限制,以至于无法进行合理的测试。
  • 或者更准确地说:这取决于您是否至少可以为您的方法提供一个 mocked recordService 对象。如果调用 getHeaderValue() 确实返回了一些东西,那么你仍然很好。
  • 有道理..谢谢
  • 其实你上一条评论很快解决了我面临的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多