如何模拟调用其他没有返回值的方法的方法



我对Mockito很陌生。我想为下面的方法写一个模拟。我会怎么写?我的模拟方法会是什么样子?

public boolean validatePersonForBenefitsProcessing(PersonDTO person) {
boolean continueProcessing = false;
if (person.isPersonOnLeave()) {
if (person.isBenefitsCoverage()) {
if (person.isPersonDriver()) {
continueProcessing = true;
} else {
if(person.isPersonOnSTD()) {
continueProcessing = false;
} else {
continueProcessing = true;
person.setSendPersonToInternal(true);
}
}
}
}
return continueProcessing;
}

问题是你这样做的目的是什么?

如果要测试此方法(例如:提高覆盖范围), 您可以创建PersonDTO的模拟,并通过声明方法调用的结果来定义它应表现出的行为。

示例可能如下所示:

public void test() {
PersonDTO personMock = mock(PersonDTO.class);
when(personMock.isPersonOnLeave()).thenReturn(true);
when(personMock.isBenefitsCoverage()).thenReturn(true);
when(personMock.isPersonOnSTD()).thenReturn(false);
Assert.assertTrue(validatePersonForBenefitsProcessing(personMock));
ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
verify(personMock).setSendPersonToInternal(captor.capture());
Assert.assertTrue(captor.getValue());
}

但是,如果您可以轻松地自己创建PersonDTO对象并提供必要的值, 它建议这样做。模拟通常应该用于你不能简单地自己创建的"复杂"对象。


如果您的目的是模拟方法本身, 然后假设你的类是SomeClass它可能看起来像这样:

SomeClass mock = mock(SomeClass.class);
when(mock.validatePersonForBenefitsProcessing(any(PersonDTO.class))).thenReturn(true);

但是,由于您的类同时修改了传入值和不合适的返回值,因为不会对传入对象进行修改。

您将被迫执行以下操作:

SomeClass mock = mock(SomeClass.class);
when(mock.validatePersonForBenefitsProcessing(any(PersonDTO.class))).thenAnswer(new Answer<Boolean>() {
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
PersonDTO dto = (PersonDTO) invocation.getArgument(0);
dto.setSendPersonToInternal(true);
return true;
}
});

正如@chrylis已经评论的那样,这样的行为可能会让其他开发人员感到惊讶,因此应尽可能避免。此外,它还使测试更容易;)

此外,正如@chrylis所说,这种方法中没有任何内容真正需要您进行这种模拟,因为您可以通过操作输入参数来自由控制代码采用的路径。

相关内容

  • 没有找到相关文章

最新更新