mockito Java自定义约束验证器在单元测试中失败,并出现“No target Validator set”错误

unhi4e5o  于 2023-11-18  发布在  Java
关注(0)|答案(2)|浏览(262)

bounty将在4天后过期。回答此问题有资格获得+150声望奖励。developer747希望引起更多关注此问题。

我有一个springboot应用程序,它像这样连接validatorFactoryBean

private LocalValidatorFactoryBean validatorFactoryBean;

@Autowired
public void setValidatorFactoryBean(LocalValidatorFactoryBean validatorFactoryBean) {
    this.validatorFactoryBean = validatorFactoryBean;
}

字符串
我在类Car上定义了自定义验证器,并像这样运行验证。

Set<ConstraintViolation<Car>> constraintViolations = validatorFactoryBean.validate(myCar);


所有这些都很好。但是当我试图通过单元测试来测试它时,

validatorFactoryBean.validate(myCar)


我得到一个错误“没有目标验证器设置”。
这是我在testng单元测试中设置validatorFactoryBean的方法

@InjectMocks
LocalValidatorFactoryBean validatorFactoryBean;


我通过调用setValidatorFactoryBean setter将它传递给我正在测试的类。
在调试时,我意识到这个validatorFactoryBean并不知道主代码中的所有约束验证器实现。
如何让validatorFactoryBean知道所有的约束验证器实现?

tct7dpnv

tct7dpnv1#

@InjectMocks只是一个mockito的东西,永远不会理解spring。这就像你手动创建一个LocalValidatorFactoryBean,而没有任何spring集成到它。
要正确配置LocalValidatorFactoryBean,可以通过将@SpringBootTest@ImportAutoConfiguration一起使用来自动配置bean验证。

@SpringBootTest
public class ValidationTest{

    @Configuration
    @ImportAutoConfiguration(ValidationAutoConfiguration.class)                
    @ComponentScan(basePackages = { "my.app.root.package" })
    public static class Config {

    }

    @Autowired
    LocalValidatorFactoryBean validatorFactoryBean;
    

    @Test
    void test(){
    
    }
    
}

字符串

dtcbnfnu

dtcbnfnu2#

我还建议你使用@SpringBootTest,就像Ken的回答中描述的那样。但是如果出于某种原因你不想这样做,只要所有的自定义约束验证器都有一个默认的,无参数的构造函数,使用下面的代码初始化的LocalValidatorFactoryBean对象应该可以用于测试:

LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
validator.afterPropertiesSet();

字符串

相关问题