Conteúdo do item:

Testando Anotação Customizada

Como testar as anotações customizadas ?

Vídeo onde crio essa classe
https://www.byiorio.com.br/product/4/item/31

Agrupamento de vídeos mostrando mais sobre Docker e Sonar
https://www.byiorio.com.br/product/11/item/40

Qual classe vamos realizar o teste ?

package br.com.byiorio.api.infra.validators;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class EmailOwaspValidator implements
        ConstraintValidator<EmailOwasp, String> {
    private int max=100;
    private boolean nullable;

    @Override
    public void initialize(EmailOwasp emailOwsap) {
        this.max = emailOwsap.max();
        this.nullable = emailOwsap.nullable();
    }

    @Override
    public boolean isValid(String conteudo, ConstraintValidatorContext contexto) {

        if (!nullable && (conteudo == null || "".equals(conteudo.trim()))) {
            contexto.disableDefaultConstraintViolation();
            contexto.buildConstraintViolationWithTemplate("Campo Obrigatório").addConstraintViolation();
            return false;
        } else if (nullable && (conteudo == null || "".equals(conteudo.trim()))) {
            return true;
        } else if (conteudo.length() > this.max) {
            contexto.disableDefaultConstraintViolation();
            contexto.buildConstraintViolationWithTemplate("Tamanho irregular").addConstraintViolation();
            return false;
        }

        final String regex = "^[a-zA-Z0-9_+&*-]{1,100}(?:\\.[a-zA-Z0-9_+&*-]{1,100}){0,100}@(?:[a-zA-Z0-9-]+\\.){1,100}[a-zA-Z]{2,7}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(conteudo);
        return matcher.matches();
    }

}

Existem duas maneiras de testar a anotação customizada:
1. Rodando o validator

Colocar as variáveis no começo da classe
   @Autowired
    private Validator validator;
    private BindingResult bindingResult;

Colocar antes do início dos testes

    // inicio
    @BeforeEach
    public void setUpClass() {
        // teste da anotacao completa
        bindingResult = new BindException(new LoginRequest(), "LoginRequest");
    }

Testando a anotação através de uma classe que utiliza essa anotação, no meu caso a classe LoginRequest  tem o @Email

    @Test
    void testAnotacao() {
        LoginRequest login = new LoginRequest();
        login.setPassword("passworddd");
        login.setUser("t@t.t");

        validator.validate(login, bindingResult);
        assertTrue(bindingResult.hasErrors());
        assertEquals("E-mail fora do padrão Owsap", bindingResult.getFieldError().getDefaultMessage());
        assertEquals("user", bindingResult.getFieldError().getField());
    }


2. Rodando o método da classe com o contexto mocado

Colocar no começo da classe
   // Teste mais rapido
    EmailOwaspValidator emailOwaspValidator = new EmailOwaspValidator();

    @Mock
    ConstraintValidatorContext context;

    @Mock
    ConstraintViolationBuilder builder;

Colocar antes do início dos testes
   // inicio
    @BeforeEach
    public void setUpClass() {
        // Teste mais rapido
        when(context.buildConstraintViolationWithTemplate(anyString())).thenReturn(builder);
    }

Executar o teste como desejar

    @Test
    void testVariacao() {
        assertFalse(emailOwaspValidator.isValid("t@t.t", context));
        assertFalse(emailOwaspValidator.isValid("atest@deeeee", context));
        assertFalse(emailOwaspValidator.isValid(null, context));

        assertFalse(emailOwaspValidator.isValid("lucas..teste@dominio.br", context));
        assertFalse(emailOwaspValidator.isValid("lucas..teste@br", context));
        assertFalse(emailOwaspValidator.isValid("lucas..teste@", context));
        assertFalse(emailOwaspValidator.isValid("lucas.teste@@", context));
        assertFalse(emailOwaspValidator.isValid("lucas@teste@com.br", context));
        assertFalse(emailOwaspValidator.isValid("lucas.teste@com..br", context));
        assertFalse(emailOwaspValidator.isValid("lucas.teste@com.br.", context));
        assertFalse(emailOwaspValidator.isValid("usuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuario@d.br", context));

        assertTrue(emailOwaspValidator.isValid("usuario@d.br", context));
        assertTrue(emailOwaspValidator.isValid("a@dominio.br", context));
        assertTrue(emailOwaspValidator.isValid("lucas.email@dominio.com", context));
        assertTrue(emailOwaspValidator.isValid("lucas@dominio.com", context));
        assertTrue(emailOwaspValidator.isValid("lucas@dominio.com.br", context));
        assertTrue(emailOwaspValidator.isValid("lucas-teste@dominio.com.br", context));
        assertTrue(emailOwaspValidator.isValid("lucas@dominio-dominio2.com.br", context));
    }
}

Modelo completo

package br.com.byiorio.api.infra.validators;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.when;

import javax.validation.ConstraintValidatorContext;
import javax.validation.ConstraintValidatorContext.ConstraintViolationBuilder;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;

import br.com.byiorio.api.login.LoginRequest;

@SpringBootTest
class EmailOwaspValidatorTest {

    // teste da anotacao completa
    @Autowired
    private Validator validator;
    private BindingResult bindingResult;

    // Teste mais rapido
    EmailOwaspValidator emailOwaspValidator = new EmailOwaspValidator();

    @Mock
    ConstraintValidatorContext context;

    @Mock
    ConstraintViolationBuilder builder;

    // inicio
    @BeforeEach
    public void setUpClass() {
        // teste da anotacao completa
        bindingResult = new BindException(new LoginRequest(), "LoginRequest");

        // Teste mais rapido
        when(context.buildConstraintViolationWithTemplate(anyString())).thenReturn(builder);
    }

    @Test
    void testAnotacao() {
        LoginRequest login = new LoginRequest();
        login.setPassword("passworddd");
        login.setUser("t@t.t");

        validator.validate(login, bindingResult);
        assertTrue(bindingResult.hasErrors());
        assertEquals("E-mail fora do padrão Owsap", bindingResult.getFieldError().getDefaultMessage());
        assertEquals("user", bindingResult.getFieldError().getField());
    }

    @Test
    void testVariacao() {
        assertFalse(emailOwaspValidator.isValid("t@t.t", context));
        assertFalse(emailOwaspValidator.isValid("atest@deeeee", context));
        assertFalse(emailOwaspValidator.isValid(null, context));

        assertFalse(emailOwaspValidator.isValid("lucas..teste@dominio.br", context));
        assertFalse(emailOwaspValidator.isValid("lucas..teste@br", context));
        assertFalse(emailOwaspValidator.isValid("lucas..teste@", context));
        assertFalse(emailOwaspValidator.isValid("lucas.teste@@", context));
        assertFalse(emailOwaspValidator.isValid("lucas@teste@com.br", context));
        assertFalse(emailOwaspValidator.isValid("lucas.teste@com..br", context));
        assertFalse(emailOwaspValidator.isValid("lucas.teste@com.br.", context));
        assertFalse(emailOwaspValidator.isValid("usuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuariousuario@d.br", context));

        assertTrue(emailOwaspValidator.isValid("usuario@d.br", context));
        assertTrue(emailOwaspValidator.isValid("a@dominio.br", context));
        assertTrue(emailOwaspValidator.isValid("lucas.email@dominio.com", context));
        assertTrue(emailOwaspValidator.isValid("lucas@dominio.com", context));
        assertTrue(emailOwaspValidator.isValid("lucas@dominio.com.br", context));
        assertTrue(emailOwaspValidator.isValid("lucas-teste@dominio.com.br", context));
        assertTrue(emailOwaspValidator.isValid("lucas@dominio-dominio2.com.br", context));
    }
}

junit; custom validation; tag; teste;



Redirecionar para https://www.byiorio.com.br/product/4/item/29