测试时,Spring注入在自定义hibernate验证器中不起作用
测试配置类测试时,Spring注入在自定义hibernate验证器中不起作用,spring,spring-mvc,testng,hibernate-validator,Spring,Spring Mvc,Testng,Hibernate Validator,测试配置类 @Configuration @Import( value = GlobalCoreContext.class) public class TestConfiguration { @Bean public Validator createValidatorFactory() { return Validation.buildDefaultValidatorFactory().getValidator(); } } public final
@Configuration
@Import( value = GlobalCoreContext.class)
public class TestConfiguration {
@Bean
public Validator createValidatorFactory() {
return Validation.buildDefaultValidatorFactory().getValidator();
}
}
public final class LoginAttemptsExceededValidatorLoginId implements ConstraintValidator<LoginAttemptsExceeded, String> {
@Resource
private LoginDao loginDao;
private LoginAttemptsExceeded loginAttemptsExceeded;
@Override
public void initialize(final LoginAttemptsExceeded loginAttemptsExceeded) {
this.loginAttemptsExceeded = loginAttemptsExceeded;
}
/**
* Validation fails if the login attempts have exceeded the preset number.
* @param loginId
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(final String loginId, final ConstraintValidatorContext constraintValidatorContext) {
if(StringUtility.IsEmpty(loginId)) return false;
return !loginDao.findByLogin(loginId).isLoginAttemptsExceeded();
}
}
@ContextConfiguration(classes = TestConfiguration.class )
public class LoginAttemptsExceededValidatorLoginIdTest extends AbstractTestNGSpringContextTests {
@Autowired
private Validator validator;
private PasswordChange passwordChange;
private LoginEntity loginEntity;
private static final String TEST_PASSWORD = "abcDEFG10";
private static final String TEST_LOGIN = "passwordChangeValidatorTestLogin";
@Resource
private LoginDao loginDao;
@BeforeMethod
public void setUp() throws Exception {
passwordChange = new PasswordChange(TEST_LOGIN, TEST_PASSWORD, "newPassword");
/**
* setup a Login record
*/
loginEntity = DataBuilder.createLogin();
loginEntity.setLogin(TEST_LOGIN);
loginEntity.setPasswordHash(encryptToBytes(TEST_PASSWORD));
loginEntity.setLoginAttempts(0);
loginDao.saveAndFlush(loginEntity);
}
@AfterMethod
public void tearDown() throws Exception {
// Remove the login record.
loginDao.delete(loginEntity);
loginDao.flush();
}
@Test
public void testIsValid() throws Exception {
Set<ConstraintViolation<PasswordChange>> constraintViolations = validator.validate(passwordChange);
assertEquals(constraintViolations.size(), 0, "When a valid username, password are supplied, the number of errors should be zero.");
}
}
验证类
@Configuration
@Import( value = GlobalCoreContext.class)
public class TestConfiguration {
@Bean
public Validator createValidatorFactory() {
return Validation.buildDefaultValidatorFactory().getValidator();
}
}
public final class LoginAttemptsExceededValidatorLoginId implements ConstraintValidator<LoginAttemptsExceeded, String> {
@Resource
private LoginDao loginDao;
private LoginAttemptsExceeded loginAttemptsExceeded;
@Override
public void initialize(final LoginAttemptsExceeded loginAttemptsExceeded) {
this.loginAttemptsExceeded = loginAttemptsExceeded;
}
/**
* Validation fails if the login attempts have exceeded the preset number.
* @param loginId
* @param constraintValidatorContext
* @return
*/
@Override
public boolean isValid(final String loginId, final ConstraintValidatorContext constraintValidatorContext) {
if(StringUtility.IsEmpty(loginId)) return false;
return !loginDao.findByLogin(loginId).isLoginAttemptsExceeded();
}
}
@ContextConfiguration(classes = TestConfiguration.class )
public class LoginAttemptsExceededValidatorLoginIdTest extends AbstractTestNGSpringContextTests {
@Autowired
private Validator validator;
private PasswordChange passwordChange;
private LoginEntity loginEntity;
private static final String TEST_PASSWORD = "abcDEFG10";
private static final String TEST_LOGIN = "passwordChangeValidatorTestLogin";
@Resource
private LoginDao loginDao;
@BeforeMethod
public void setUp() throws Exception {
passwordChange = new PasswordChange(TEST_LOGIN, TEST_PASSWORD, "newPassword");
/**
* setup a Login record
*/
loginEntity = DataBuilder.createLogin();
loginEntity.setLogin(TEST_LOGIN);
loginEntity.setPasswordHash(encryptToBytes(TEST_PASSWORD));
loginEntity.setLoginAttempts(0);
loginDao.saveAndFlush(loginEntity);
}
@AfterMethod
public void tearDown() throws Exception {
// Remove the login record.
loginDao.delete(loginEntity);
loginDao.flush();
}
@Test
public void testIsValid() throws Exception {
Set<ConstraintViolation<PasswordChange>> constraintViolations = validator.validate(passwordChange);
assertEquals(constraintViolations.size(), 0, "When a valid username, password are supplied, the number of errors should be zero.");
}
}
由于某种原因,loginattentsexceeddvalidatorloginid
中的loginDao
方法无效它在运行时运行良好。
但是在单元测试期间,LoginDao
不会被注入到验证器中,即使javax.validation.Validator
被注入到单元测试中
我做错了什么?我猜你的问题就在这里:
@Bean
public Validator createValidatorFactory() {
return Validation.buildDefaultValidatorFactory().getValidator();
}
这将构建默认的验证器,包括默认的ConstraintValidatorFactory,它不注入SpringBean。如果你查看文档,你会发现
默认情况下,LocalValidatorFactoryBean配置
SpringConstraintValidatorFactory,使用Spring创建
ConstraintValidator实例。这允许您进行自定义
约束验证程序从依赖项注入中获益
其他的春豆
(见附件)
您必须确保您的验证器使用相同的约束验证器工厂。或者为什么不将LocalValidatorFactoryBean直接注入测试?如果我理解正确的话,globalconcerontext就是通过编程方式配置bean的地方。为什么不在那里添加LocalValidatoryFactoryBean呢。但是,我不是弹簧专家。我猜您的问题在于:
@Bean
public Validator createValidatorFactory() {
return Validation.buildDefaultValidatorFactory().getValidator();
}
这将构建默认的验证器,包括默认的ConstraintValidatorFactory,它不注入SpringBean。如果你查看文档,你会发现
默认情况下,LocalValidatorFactoryBean配置
SpringConstraintValidatorFactory,使用Spring创建
ConstraintValidator实例。这允许您进行自定义
约束验证程序从依赖项注入中获益
其他的春豆
(见附件)
您必须确保您的验证器使用相同的约束验证器工厂。或者为什么不将LocalValidatorFactoryBean直接注入测试?如果我理解正确的话,globalconcerontext就是通过编程方式配置bean的地方。为什么不在那里添加LocalValidatoryFactoryBean呢。但是,我不是Spring专家。你能不能简化一下代码,这样错误仍然会发生,但我们不必阅读无用的代码。还有一些类可能会影响代码,但我们没有看到它们:GlobalReconText、AbstractTestNGSpringContextTests。谢谢你的回复,马雷克
AbstractTestNGSpringContextTests
是一个SpringTest类。我已经添加了globalcorontext.java
。你能简化一下代码吗?这样错误仍然会发生,但我们不必阅读无用的代码。还有一些类可能会影响代码,但我们没有看到它们:GlobalReconText、AbstractTestNGSpringContextTests。谢谢你的回复,马雷克AbstractTestNGSpringContextTests
是一个SpringTest类。我已经添加了globalcorontext.java
。感谢您将localvalidatorybean
直接添加到unittest中效果很好。感谢您将localvalidatorybean
直接添加到unittest中效果很好。