Spring boot 如何在Spring引导测试中模拟绑定结果?

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

在TestClass中,我添加了
@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");
        }
    }
}`