@Valid не запускает проверку в @Repository - PullRequest
3 голосов
/ 25 октября 2019

Я пишу модульные тесты, чтобы проверить, работает ли проверка входных данных в моем репозитории Spring, но это не похоже на это.

Проще говоря, у меня есть класс репозитория:

@Repository
public class CustomerRepository {
    // Java client for Redis, that I extend as JedisConnector in order to make it a Bean
    private Jedis jedis;

    @Autowired
    public CustomerRepository(JedisConnector jedis) {
        this.jedis = jedis;
    }

    private <S extends Customer> S save(@Valid S customer) throws CustomerException {
        try {
            this.jedis.set(...);  // writing to Redis (mocked in test)
            return customer;
        } catch (JsonProcessingException e) {
            throw new CustomerException(e.toString());
        }
    }
}

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

@AllArgsConstructor
@NoArgsConstructor
@Data // from Lombok
public class Customer {
    @Email(message = "Email must be valid.")
    private String identifier;

    @NotBlank(message = "Password cannot be null or empty string.")
    private String password;

    @URL(message = "URL must be a url.")
    private String url;
}

Поэтому я написал подобный тестовый модуль, ожидая, что он выдаст исключение, которое я могу утверждать:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {JedisConnector.class})
public class CustomerRepositoryTest {
    // Cannot autowire because dependent bean needs to be configured
    private CustomerRepository customerRepository;

    @MockBean
    JedisConnector jedisConnector;

    @Before
    public void setUp() {
        // Configure Mock JedisConnector
        MockitoAnnotations.initMocks(this);
        Mockito.when(jedisConnector.select(anyInt())).thenReturn("OK");

        // Manually wire dependency
        customerRepository = new CustomerRepository(jedisConnector);
    }


    @Test
    public void saveShouldFailOnInvalidInput() throws CustomerException {
        Mockito.when(jedisConnector.set(anyString(), anyString())).thenReturn("OK");
        // Blatantly invalid input
        Customer customer = new Customer("testemail", "", "testurl");
        customerRepository.save(customer);
    }
}

Но он просто проходит, выводит только отладочные сообщения (которые я пропустил в этом вопросе). Как применить проверку? Если возможно, я бы хотел избежать явного вызова валидатора в каждом методе хранилища.

Я видел много примеров в Интернете, которые япопытался воспроизвести (от Baeldung до DZone, конечно, на этом же сайте было много вопросов, включая этот интересный ), но все еще безуспешно. Чего мне не хватает?

1 Ответ

1 голос
/ 25 октября 2019

Похоже, вам нужно реализовать integration test, если вы хотите использовать repository via, чтобы javax.validation.ConstraintViolationException выдавалось, показывая must not be blank, но если вы хотите протестировать только эти проверки, вам придется протестировать с помощьюиспользуя валидатор следующим образом:

1.- Добавьте следующую зависимость:

<dependency> 
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.13.Final</version>
</dependency> 

2.- Добавьте пользовательские проверочные тесты для полей Customer

import javax.validation.Validation;
import javax.validation.Validator;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringRunner;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
public class CustomerValidationTest {

    private Validator validator;

    @Before
    public void setupValidatorInstance() {
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }

    @Test
    public void whenNotEmptyPassword_thenNoConstraintViolations() {
        Customer customer = new Customer();
        customer.setPassword("");
        Set<ConstraintViolation<Customer>> violations = validator.validate(customer);

        assertThat(violations.size()).isEqualTo(1);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...