[JAVA] Test de validation d'élément unique de printemps

introduction

Vous pouvez voir le contrôle de fonctionnement de la validation d'un seul élément tel que la classe Form écrite dans le test de Controller. Le test Controller est souvent écrit à l'avance, et s'il y a de nombreux modèles de test, la classe de test deviendra grande et la lisibilité se détériorera.

L'écriture en tant que test de la classe Form réduit la quantité de code et rend le contenu du test clair.

Ci-dessous, confirmé avec Spring Boot 2.0.5.

Classe testée

Testez la validation de la classe ʻUserForm` suivante.

import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
public class UserForm {

    @NotNull
    private Integer userId;

    @Size(max = 2)
    @NotBlank
    private String userName;

}

** Validation ** Implémentez la validation suivante avec des annotations dans chaque champ.

Classe d'essai

Créé comme une classe de test pour la classe ʻUserForm`.

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Validator;

import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;


@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class UserFormTest {

    @Autowired
    Validator validator;

    private UserForm userForm = new UserForm();
    private BindingResult bindingResult = new BindException(userForm, "UserForm");

    @Before
    public void before() {
        userForm.setUserId(1);
        userForm.setUserName("Ryu-bi");
    }

    /**
     *Pas d'erreur
     */
    @Test
    public void noError() {
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError(), is(nullValue()));
    }

    /**
     *userId est nul
     */
    @Test
    public void userIdIsNull() {
        userForm.setUserId(null);
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userId"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("must not be null"));
    }

    /**
     *La taille de userName dépasse la limite supérieure
     */
    @Test
    public void userNameSizeIsOverLimit() {
        userForm.setUserName("Summer Hou");
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userName"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("size must be between 0 and 2"));
    }

    /**
     *userName est nul
     */
    @Test
    public void userNameIsNull() {
        userForm.setUserName(null);
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userName"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("must not be blank"));
    }

    /**
     *userName est vide
     */
    @Test
    public void userNameIsBlank() {
        userForm.setUserName("");
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userName"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("must not be blank"));
    }

    /**
     *userName n'est qu'un espace demi-largeur
     */
    @Test
    public void userNameIsOnlySpace() {
        userForm.setUserName("  ");
        validator.validate(userForm, bindingResult);
        assertThat(bindingResult.getFieldError().getField(), is("userName"));
        assertThat(bindingResult.getFieldError().getDefaultMessage(), is("must not be blank"));
    }
}

La validation peut être effectuée en passant ʻorg.springframework.validation.Validator à @ Autowired et ʻuserForm et bindingResult à la méthode validate. Le résultat de la validation est dans bindingResult, vous pouvez donc affirmer le contenu.

En ce qui concerne la façon d'écrire une méthode de test, je pense que c'est bon dans le but de voir créer un état système normal avec `avant 'et de ne changer qu'une partie en système anormal avec chaque méthode de test et de la tester. ..

Supplément

Lorsqu'on lui a demandé si le test Controller n'est pas du tout nécessaire car la classe Form peut effectuer un test de validation à un seul terme, par exemple, le Controller convertit le message d'erreur, ou la classe Form est validée en premier lieu. Si vous voulez vérifier si c'est le cas, vous devez tester avec Controller.

Cependant, étant donné que les tests exhaustifs peuvent être supprimés en testant la classe «Form», il ne fait aucun doute que le nombre de modèles de test dans «Controller» peut être réduit.

Recommended Posts

Test de validation d'élément unique de printemps
Test de validation de classe de formulaire avec Spring Boot
Validation personnalisée avec Spring
[JUnit 5] Ecrivez un test de validation avec Spring Boot! [Test de paramétrage]
Validation du ressort et code d'erreur
Test de mémo d'utilisation de Spring Security
Modifier le message de validation Spring Boot
Comment faire un test unitaire de Spring AOP
Écrire du code de test avec Spring Boot
Obtenez des résultats de validation avec Spring Boot
Utiliser DBUnit pour le test Spring Boot
Contrôleur de cadre de test Spring avec Junit
À propos des erreurs lors de la mise en œuvre de la validation du printemps