0

场景是我正在尝试验证域对象并将验证消息存储在另一个对象中。该类Validator和方法如下所示:

public void validate (Domain domain, ValidationInfo info)

ValidationInfo对象具有:

List<String> messages = new ArrayList<String> messages ()

该类Validator是从服务类调用的。无论域对象的验证失败,失败消息都将存储在ValidationInfo类的列表中。

在一个测试用例的服务测试类中,我编写了以下代码来测试验证失败:

@Test
public void testvalidation () throws Exception { 
    Domain domain = createDomainWithInvalidData();
    service.create (domain);
    verify(mockValidator).validate(domain, validationInfo);
    assertFalse (validationInfo.getMessages().isEmpty());

现在我想要的是从validationInfo对象中获取失败消息,以便我可以基于它编写一些断言。但它不起作用。

任何人都可以对此有所了解。

4

2 回答 2

0

在折断了几个小时后,我能够实现我想要的。

我们需要做的是使用doAnswermockito。请在以下代码段中找到:

doAnswer(new Answer<ValidationInfo> () {
  @Override
  public ValidationInfo answer (InvocationOnMock invocationOnMock) throws Throwable {
     Object [] args = invocationOnMock.getArguments();
     ValidationInfo vi = (ValidationInfo) args [1];
     vi.getMessages.add("some message");
     return vi;
}}).when(validator).validate (domain, validationInfo);

通过这种方式,我能够将自定义失败消息放入列表中,从而使服务中的验证失败;这是测试的全部目的。

之前测试没有通过,因为在服务代码中检查了列表的大小。并且列表大小始终为零,因为verify只会验证方法是否被调用,但实际上不会改变对象的状态。

希望这可以帮助。如果有更好的方法来实现这一点,请发表评论。

于 2012-09-19T13:28:10.280 回答
0

根据我收集到的信息,您正在对service.

实际上,获取消息是没有意义的,validationInfo因为它被传递给Mockito 模拟方法,除非您编写存根() ,否则根据定义该方法什么都不做。given(...).willReturn(...)即使您的代码示例中的最后一个断言也不是必需的,因为validationInfo 不会被validate.

Mockito 旨在测试协作者之间的交互,这已经通过您的验证完成verify(...),因为您正在测试服务以及他与Validator.

测试写入的消息ValidationInfo与范围无关service

但是,您想要的是对 进行单元测试Validator,您应该在其中为验证消息编写特定的测试。ValidationInfo请看下面的片段,我在其中想象了API的某些部分:

public class ValidatorTest {

    Validator validator = new Validator(); // not a mock

    @Test
    public void when_<some_part_of_the_domain>_is_incorrect_report_validation_error() throws Exception { 
        // given
        Domain domain = createDomainWithInvalidData();

        // when
        validator.validate(domain, validationInfo);

        // then
        assertThat(validationInfo.getMessages()).isNotEmpty()); // not really necessary
        assertThat(validationInfo.getLastMessage().text()).contains("<some_part_of_the_domain> is wrong");
    }
}

请注意,我使用了BDD关键字(given、when、then)来帮助我编写测试。Alos 我使用了 FestAssert 库,它提供了很好的断言工具。

希望有帮助。

于 2012-09-19T10:57:00.730 回答