Spring boot 如何在Spring引导测试中模拟绑定结果?
在TestClass中,我添加了Spring boot 如何在Spring引导测试中模拟绑定结果?,spring-boot,Spring Boot,在TestClass中,我添加了@Import(MandatairesFormValidator.class) 当我模拟控制器时,我可以进入控制器内部,但无法访问方法validate.validate(),如下所示: 控制器是: @PatchMapping(value = "/{id}", consumes = APPLICATION_JSON_UTF8_VALUE, produces = APPLICATION_JSON_UTF8_VALUE) ResponseEntity<Obj
@Import(MandatairesFormValidator.class)
当我模拟控制器时,我可以进入控制器内部,但无法访问方法validate.validate(),如下所示:
控制器是:
@PatchMapping(value = "/{id}", consumes = APPLICATION_JSON_UTF8_VALUE, produces = APPLICATION_JSON_UTF8_VALUE)
ResponseEntity<Object> modifierDonnees(@PathVariable final Long id,
@Valid @RequestBody final ModificationUI modificationUI, BindingResult bindingResult) {
validator.validate(modificationUI, bindingResult);
if (bindingResult.hasErrors()) {
List<String> errors = bindingResult.getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.toList());
throw new MandataireValidationException(errors);
}
}
使用:@Import(MandatairesFormValidator.class)控制器中的验证器为空;
使用:@Mock
私有MandatairesFormValidator MandatairesFormValidator;它跳过“validator.validate()”方法-->
BindingResult=mock(BindingResult.class);
when(bindingResult.hasErrors())。然后返回(true)
验证器:
@Component
public class MandatairesFormValidator implements Validator {
public static final String international_number="(0{1,2}|\\+\\d{2,})(-|\\.|\\s*|\\d*)*";
public boolean supports(Class<?> clazz) {
return ModificationUI.class.isAssignableFrom(clazz);
}
private Boolean isValidNatel(String telephone){
return Objects.nonNull(telephone) && (telephone.matches(international_number));
}
public void validate(Object o, Errors errors) {
ModificationUI modificationUI = (ModificationUI) o;
ModificationMandataireUI modificationMandataire = modificationUI.getModificationMandataire();
MandataireSoustractionUI mandataireSoustractionUI1 = modificationAffaireMandataire.getMandataireSoustraction1();
MandataireSoustractionUI mandataireSoustractionUI2 = modificationAffaireMandataire.getMandataireSoustraction2();
Boolean isValidNatel1 = (Objects.nonNull(mandataireSoustractionUI1) && isValidNatel(mandataireSoustractionUI1.getTelephone()) || Objects.isNull(mandataireSoustractionUI1));
Boolean isValidNatel2 = (Objects.nonNull(mandataireSoustractionUI2) && isValidNatel(mandataireSoustractionUI2.getTelephone()) || Objects.isNull(mandataireSoustractionUI2));
if ( !isValidNatel1 ) {
String telephone1=mandataireSoustractionUI1.getTelephone();
String msg1= Objects.nonNull(telephone1) ? telephone1 : "";
errors.reject("telephone", "Téléphone 1 " + msg1 +" pas valide");
}
if ( !isValidNatel2 ) {
String telephone2=mandataireSoustractionUI2.getTelephone();
String msg2= Objects.nonNull(telephone2) ? telephone2 : "";
errors.reject("telephone", "Téléphone 2" + msg2 + " pas valide");
}
}
}`
@组件
公共类MandatairesFormValidator实现验证器{
公共静态最终字符串国际\u编号=“(0{1,2}\\+\\d{2,}”(-124\\.\ 124\\\ s*\\\\d*)*”;
公共布尔支持(类clazz){
返回ModificationUI.class.isAssignableFrom(clazz);
}
专用布尔值isValidNatel(字符串电话){
返回Objects.nonNull(telephone)和&(telephone.matches(international_number));
}
公共无效验证(对象o、错误){
ModificationUI ModificationUI=(ModificationUI)o;
ModificationMandataireUI modificationMandataire=modificationUI.getModificationMandataire();
mandatairessourstractionui mandatairessourstractionui1=modificationafairedmandataire.getmandairessourstraction1();
mandatairessourstractionui mandairessourstractionui2=modificationafairedmandataire.getmandairessourstraction2();
布尔值isValidNatel1=(Objects.nonNull(mandadirectsoutractionui1)和&isValidNatel(mandadirectsoutractionui1.getTelephone())| | Objects.isNull(mandadirectsoutractionui1));
布尔值isValidNatel2=(Objects.nonNull(mandatairesoutractionui2)和&isValidNatel(mandatairesoutractionui2.getTelephone())| | Objects.isNull(mandatairesoutractionui2));
如果(!isValidNatel1){
String telephone1=mandairesoutractionui1.getTelephone();
字符串msg1=Objects.nonNull(电话1)?电话1:;
错误。拒绝(“电话”、“Téléphone 1”+msg1+“pas valide”);
}
如果(!isValidNatel2){
String telephone2=mandairesoutractionui2.getTelephone();
字符串msg2=Objects.nonNull(电话2)?电话2:;
错误。拒绝(“电话”、“Téléphone 2”+msg2+“pas valide”);
}
}
}`
我尝试过使用,当然不是在模拟控制器时,而是在绕过实现,但这似乎不是问题所在。您想测试什么(控制器或验证器)根据yur测试判断您想为您的控制器编写集成测试(即
@WebMvcTest
)。您好,我想测试控制器。为了测试验证器,我不需要任何模拟。当我测试控制器时,我无法模拟MandatairesFormValidator以通过内部validator.validate()请参阅我的书中关于如何测试验证的第8章。感谢Wi和我对你的书的赞扬,但我仍然无法解决我的问题。假设你使用@WebMvcTest
使用@MockBean
而不是@Mock
。
@Component
public class MandatairesFormValidator implements Validator {
public static final String international_number="(0{1,2}|\\+\\d{2,})(-|\\.|\\s*|\\d*)*";
public boolean supports(Class<?> clazz) {
return ModificationUI.class.isAssignableFrom(clazz);
}
private Boolean isValidNatel(String telephone){
return Objects.nonNull(telephone) && (telephone.matches(international_number));
}
public void validate(Object o, Errors errors) {
ModificationUI modificationUI = (ModificationUI) o;
ModificationMandataireUI modificationMandataire = modificationUI.getModificationMandataire();
MandataireSoustractionUI mandataireSoustractionUI1 = modificationAffaireMandataire.getMandataireSoustraction1();
MandataireSoustractionUI mandataireSoustractionUI2 = modificationAffaireMandataire.getMandataireSoustraction2();
Boolean isValidNatel1 = (Objects.nonNull(mandataireSoustractionUI1) && isValidNatel(mandataireSoustractionUI1.getTelephone()) || Objects.isNull(mandataireSoustractionUI1));
Boolean isValidNatel2 = (Objects.nonNull(mandataireSoustractionUI2) && isValidNatel(mandataireSoustractionUI2.getTelephone()) || Objects.isNull(mandataireSoustractionUI2));
if ( !isValidNatel1 ) {
String telephone1=mandataireSoustractionUI1.getTelephone();
String msg1= Objects.nonNull(telephone1) ? telephone1 : "";
errors.reject("telephone", "Téléphone 1 " + msg1 +" pas valide");
}
if ( !isValidNatel2 ) {
String telephone2=mandataireSoustractionUI2.getTelephone();
String msg2= Objects.nonNull(telephone2) ? telephone2 : "";
errors.reject("telephone", "Téléphone 2" + msg2 + " pas valide");
}
}
}`