1
resposta

Como funciona uma Specification?

O código abaixo é de uma aplicação criada comforme o que foi aprendido em aula. Eu preciso criar testes para essa classe e não consigo, pois não sei como ele funciona direito. Tenho 2 perguntas:

1) como seria esse código sem o uso de lambda? return (root, criteriaQuery, criteriaBuilder) -> criteriaBuilder.like(root.get("nome"), "%" + nome + "%");

2) E se tem uma forma de testar essa classe (com o uso do lambda), pois ao testar a cobertura não passa na linhas? criteriaBuilder.like(root.get("nome"), "%" + nome + "%");

public class ContatoSpecification {

public static Specification<Contato> nome(String nome) {
    return (root, criteriaQuery, criteriaBuilder) -> 
        criteriaBuilder.like(root.get("nome"), "%" + nome + "%");
}

public static Specification<Contato> uf(String uf) {
    return (root, criteriaQuery, criteriaBuilder) -> 
        criteriaBuilder.equal(root.get("endereco").get("uf"), uf);
}

public static Specification<Contato> localidade(String localidade) {
    return (root, criteriaQuery, criteriaBuilder) -> 
        criteriaBuilder.equal(root.get("endereco").get("localidade"), localidade);
}

public static Specification<Contato> bairro(String bairro) {
    return (root, criteriaQuery, criteriaBuilder) -> 
        criteriaBuilder.equal(root.get("endereco").get("bairro"), bairro);
}

}

1 resposta

Olá Ricardo,

A Specification é uma interface do Spring Data JPA que permite a criação de consultas dinâmicas, ou seja, consultas que podem ser montadas em tempo de execução, de acordo com os parâmetros passados.

Respondendo à sua primeira pergunta, sem o uso de lambda, o código ficaria assim:

public static Specification<Contato> nome(final String nome) {
    return new Specification<Contato>() {
        @Override
        public Predicate toPredicate(Root<Contato> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
            return criteriaBuilder.like(root.get("nome"), "%" + nome + "%");
        }
    };
}

Já em relação à sua segunda pergunta, é possível testar a classe ContatoSpecification utilizando o lambda. Talvez o problema de cobertura esteja relacionado a algum outro trecho de código que não está sendo testado corretamente.

Espero ter ajudado e bons estudos!