当前位置: 首页 > 知识库问答 >
问题:

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

朱皓
2023-03-14

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

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;
    }

共有1个答案

郑嘉年
2023-03-14

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

如果要测试这个方法(例如:为了提高覆盖率),可以创建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());
}
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所说,该方法中没有任何内容需要您进行这种模拟,因为您可以通过操作输入参数来自由地控制代码所采用的路径。

 类似资料:
  • 给定一个类Foo 为什么我用Spock来嘲笑Foo 调用总是返回false? 不确定这是否有区别,但测试是在Groovy/Spock中进行的,而Foo是在Java8中进行的。

  • 如何模拟返回已强制转换的模拟对象的方法。 试验方法。

  • 问题内容: 使用模拟编写单元测试时遇到问题。我需要模拟的对象有很多吸气剂,我确实在代码中称呼它们。但是,这些不是我的单元测试的目的。因此,有一种方法可以模拟所有方法,而不是一个个地模拟它们。 这是代码示例: 这是我需要测试的服务等级 在测试类中,测试方法就像 因此,有一种方法可以避免将所有无用的“ field1”的“ when”写入“ field20” 问题答案: 您可以控制模拟的默认答案。在创建

  • 我在用Mock编写单元测试时遇到了一个问题。有一个对象,我需要模拟有很多getter,我在代码中调用它们。但是,这些不是我的单元测试的目的。所以,有没有一种方法我可以模拟所有的方法,而不是一个一个地模拟它们。 下面是代码示例: 那么,有没有一种方法可以避免为无用的“field1”到“field20”写所有的“when”

  • 让我向您展示getCurrentWeatherWithForecastUsecase类actgually是什么样子: } //这很容易,它只需要一个天气存储库,并要求它获取结果。我把它发送回调用者,调用者将显示它。 更新: 以下是故障的整个堆栈跟踪: