У меня простой интерфейс службы:
@Service
@Validated
public interface UserService
{
void createUser (@Email String userEmail);
void refreshUsers ();
}
Я хочу протестировать 2 вещи на UserService
:
- Аннотация проверки
@Email
работает. - Вызов метода
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.