我对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
所说,这种方法中没有任何内容真正需要您进行这种模拟,因为您可以通过操作输入参数来自由控制代码采用的路径。