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.
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.
userId
@NotNull
userName
@Size(max = 2)
@NotBlank
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. ..
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