Un mémo de la procédure de l'écriture d'un validateur auto-fabriqué avec Bean Validation à l'écriture d'un test unitaire.
Je vais essayer de faire un validateur pour juger s'il s'agit d'un nom de chanson de Michael Jackson.
package com.example.customvalidate;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.ArrayList;
import java.util.List;
public class MJValidator implements ConstraintValidator<MJ, String> {
private final static List<String> songs = new ArrayList<String>() {
{
add("Remember The Time"); add("Stranger In Moscow"); add("You Are Not Alone");
}
};
public void initialize(MJ constraintAnnotation) {
}
public boolean isValid(String value, ConstraintValidatorContext context) {
return songs.stream().anyMatch(song -> song.equals(value));
}
}
--Hériter de l'interface ConstraintValidator
. Pour les génériques, spécifiez l'annotation à créer ultérieurement et le type à valider.
Faites une annotation. Vous pouvez maintenant l'utiliser comme @ MJ
package com.example.customvalidate;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = {MJValidator.class})
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MJ {
String message() default "you must specify one of Michael Jackson's songs.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@interface List {
MJ[] value();
}
}
--Spécifiez la classe à valider à la place de @Constraint (validatedBy =)
. Spécifiez le MJ Validator
créé ci-dessus.
--Pour @ Target
, spécifiez la cible à laquelle cette annotation peut être ajoutée. Cette fois, c'était un argument et un champ.
--Pour message
, spécifiez le message qui sera défini dans l'objet d'exception lorsque la validation est interceptée.
package com.example.customvalidate;
import org.junit.Before;
import org.junit.Test;
import javax.validation.*;
import java.util.Set;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
public class MJValidatorTest {
private Validator validator;
@Before
public void setUp() {
validator = Validation.buildDefaultValidatorFactory().getValidator();
}
@Test
public void Une erreur se produira si vous transmettez un titre de chanson incorrect.() {
TestBean bean = new TestBean("Remember a Time");
Set<ConstraintViolation<Object>> violations = validator.validate(bean);
assertThat(violations.isEmpty(), is(false));
String expectedMessage = "you must specify one of Michael Jackson's songs.";
violations.forEach(v -> assertThat(v.getMessage().equals(expectedMessage), is(true)));
}
@Test
public void Ne provoque pas d'erreur lors de la transmission du titre de chanson correct() {
TestBean bean = new TestBean("Remember The Time");
Set<ConstraintViolation<Object>> violations = validator.validate(bean);
assertThat(violations.isEmpty(), is(true));
}
private static class TestBean {
@MJ
private String song;
TestBean(String song) {
this.song = song;
}
}
}
Exécutez-le et si le test réussit bien.
--Une classe appropriée est créée en tant que classe interne de la classe de test, et l'annotation créée cette fois est définie dans le champ.
Recommended Posts