gpt4 book ai didi

spring - Spring 中的单元测试 JSR-303 验证

转载 作者:行者123 更新时间:2023-12-01 08:17:59 24 4
gpt4 key购买 nike

我正在尝试使用 JSR-303 验证在 spring 中为带注释的 bean 添加单元测试。

bean 很简单,如下所示:

public class Bean {
@Size(max=XX)
String text;
}

在 Spring 配置中,我拥有所有必需的 JAR 文件:
 validation-api  
hibernate-validator

验证器初始化为:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

我对测试用例的尝试如下所示(去除了 Spring 和其他绒毛):
@Autowired
private LocalValidatorFactoryBean factory;


@Test
public void testTemplateFormBeanValidation() {
// TODO exception at the moment. Can not resolve the validator. Provider issue.
factory.setProviderClass(HibernateValidator.class);
factory.setTraversableResolver(new DefaultTraversableResolver());
Validator val = factory.getValidator();
TemplateFormBean fb1 = new TemplateFormBean();
fb1.setText("this text works");
Set<ConstraintViolation<TemplateFormBean>> constraints = val.validate(fb1);
assertNull(constraints);

}

当我运行这个测试时,我得到以下堆栈跟踪:
java.lang.AbstractMethodError: javax/persistence/spi/PersistenceProvider.getProviderUtil()Ljavax/persistence/spi/ProviderUtil;
at javax.persistence.Persistence$1.isLoaded(Persistence.java:78)
at org.hibernate.validator.engine.resolver.JPATraversableResolver.isReachable(JPATraversableResolver.java:62)
at org.hibernate.validator.engine.resolver.DefaultTraversableResolver.isReachable(DefaultTraversableResolver.java:94)
at org.hibernate.validator.engine.resolver.SingleThreadCachedTraversableResolver.isReachable(SingleThreadCachedTraversableResolver.java:47)
at org.hibernate.validator.engine.ValidatorImpl.isValidationRequired(ValidatorImpl.java:757)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraint(ValidatorImpl.java:324)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForRedefinedDefaultGroup(ValidatorImpl.java:273)
at org.hibernate.validator.engine.ValidatorImpl.validateConstraintsForCurrentGroup(ValidatorImpl.java:256)
at org.hibernate.validator.engine.ValidatorImpl.validateInContext(ValidatorImpl.java:210)
at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:119)
at org.springframework.validation.beanvalidation.SpringValidatorAdapter.validate(SpringValidatorAdapter.java:145)
at general.TestValidationBeans.testTemplateFormBeanValidation(TestValidationBeans.java:30)

我是否缺少一些依赖项?我使用带有 JPA2 注释的 Hibernate 作为持久性,所以所有这些 JAR 都存在并且正在工作。

Hibernate的版本是:
2011-04-19 08:37:47 [INFO] Version - Hibernate Commons Annotations 3.2.0.Final
2011-04-19 08:37:47 [INFO] Environment - Hibernate 3.6.2.Final
2011-04-19 08:37:47 [INFO] Environment - hibernate.properties not found
2011-04-19 08:37:47 [INFO] Environment - Bytecode provider name : javassist
...
2011-04-19 08:37:47 [INFO] Version - Hibernate Validator 4.1.0.Final

为什么 Hibernate 不记录 hibernate-annotations 的版本?根据文档,它是从我正在使用的 hibernate3.jar 中的 hibernate 3.5 中捆绑的。
我是否应该看到休眠注释的日志输出(类似于“版本 - 休眠注释 3.4.0 GA)?

最佳答案

我使用上下文配置进行了更简单的设置,如下所示:

MyTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class MyTest {

@Autowired
private Validator validator;


@Test
public void testMyForm() {
final MyForm form = new MyForm();
.
.
final Set<ConstraintViolation<MyForm>> violations = validator.validate(form);
assertTrue(violations.isEmpty());
}
}

MyTest-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

</beans>

关于spring - Spring 中的单元测试 JSR-303 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com