Не удалось вызвать verify () макета, который проксируется MethodValidationPostProcessor - PullRequest
0 голосов
/ 07 мая 2020

У меня простой интерфейс службы:

@Service
@Validated
public interface UserService
{
    void createUser (@Email String userEmail);

    void refreshUsers ();
}

Я хочу протестировать 2 вещи на UserService:

  1. Аннотация проверки @Email работает.
  2. Вызов метода refreshUsers() можно проверить с помощью verify().

Поэтому я создал следующий тестовый пример с SpringJUnit4ClassRunner:

@RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = UserServiceTest.TestConfig.class)
public class UserServiceTest
{
    @Configuration
    public static class TestConfig
    {
        @Bean
        public UserService userService ()
        {
            return mock(UserService.class);
        }

        @Bean
        public MethodValidationPostProcessor methodValidationPostProcessor ()
        {
            return new MethodValidationPostProcessor();
        }
    }

    @Autowired
    private UserService userService;

    @Test
    public void createUserWithValidEmail ()
    {
        userService.createUser("aaa@example.com");
    }

    @Test
    public void createUserWithInvalidEmail ()
    {
        assertThatThrownBy(() -> userService.createUser("aaa"))
            .isInstanceOf(ConstraintViolationException.class);
    }

    @Test
    public void refreshUsersCalled1 ()
    {
        userService.refreshUsers();
        verify(userService).refreshUsers();
    }

    @Test
    public void refreshUsersCalled2 ()
    {
        userService.refreshUsers();
        verify(userService).refreshUsers();
    }

Тестовый пример refreshUsersCalled2() завершится ошибкой со следующим сообщением:

Missing method call for verify(mock) here:
-> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Example of correct verification:
    verify(mock).doSomething()

Also, this error might show up because you verify either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.

Однако метод refreshUsers() не является одним из методов final / private / equals () / hashCode ().

После некоторого расследования я обнаружил, что проблема возникла из-за конфликта между mock() и MethodValidationPostProcessor.

Если я удалю компонент MethodValidationPostProcessor Spring из TestConfig, указанные выше проблемы будут решены. . Однако тестовый пример createUserWithInvalidEmail завершится ошибкой, потому что механизм проверки отсутствует.

Есть ли способ протестировать и проверку, и verify() в одном тесте?

Полный пример: в https://github.com/johnlinp/misc-demo/tree/master/mockito-with-validation-in-spring-test.

...