在mockito中使用带有返回类型的方法的doNothing()

时间:2018-02-26 13:30:06

标签: java unit-testing methods mockito

public void attestResults(List<OMInvestigationResultMutableDTO.Id> resultIds, OMRequestSpeciality speciality)
{
  List<Answer.Id> attestIds = new ArrayList<Answer.Id>();
  for (OMInvestigationResultMutableDTO.Id id : resultIds)
  {
    Answer.Id answerId = answerIdFactory.createId(id.getValue(), null);
    attestIds.add(answerId);
  }

  orderManagementServiceProvider.getOrderManagementService()
    .attestResults(attestIds, 
  RequestSpeciality.valueOf(speciality.toString()));
}

我的问题是如何为attestResults()编写单元测试。 我想在mockito中使用doNothing()来尝试模拟orderManagementServiceProvider.getOrderManagementService()。attestResults()。

这是方法orderManagementServiceProvider.getOrderManagementService()。attestResults,

public List<Id> attestResults(List<Id> answerIds, RequestSpeciality speciality) {
    this.accessHandler.checkAccess(AccessRights.ATTEST_RESULTS);
    ArgumentValidator.argument(answerIds, "AnswerIds").notNull().notEmpty();
    ArgumentValidator.argument(speciality, "Speciality").notNull();
    ResultCreator resultCreator = new ResultCreator(this.resultToolkitAdapter, this.pathologyReportToolkitService);
    return resultCreator.attestResults(answerIds, speciality);
}

在这种情况下,我无权使用powerMockito。

我嘲笑道   when(orderManagementServiceProvider.getOrderManagementService()).thenReturn(omService);

1 个答案:

答案 0 :(得分:1)

测试代码(剪切)中的相关行是:

orderManagementServiceProvider.getOrderManagementService()
   .attestResults(attestIds,
                  RequestSpeciality.valueOf(speciality.toString()));

由于违反了 Demeter法(不要与陌生人交谈!),你必须同时模仿:OrderManagementService和{{1}的实例}。然后你必须配置后者的模拟,以便在调用OrderManagementServiceProvider时返回第一个模拟。

但是,getOrderManagementService()仅适用于 spy 上的doNothing()方法(依赖项的包装具体实例)。无论如何, mock 上的void方法都不会被调用。

如果您的方法具有返回值,则必须使用void(或doReturn()),以便切割可以对方法结果起作用。默认情况下,Mockito将分别返回doThrow()null0

警告:

表单false 执行调用mocked方法(并抛弃其结果)。如果方法访问模拟中其他未配置的方法返回的成员变量或对象,则可能导致NPE。