Тестирование модуля JSR-303 в Spring
Я пытаюсь добавить unit test для аннотированного bean в spring с использованием проверки JSR-303.
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)
Мне не хватает некоторых зависимостей? Я использую Hibernate с аннотациями JPA2 как персистентность, поэтому все эти 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? Согласно документам, он связан с hibernate 3.5 в hibernate3.jar, который я использую.
Должен ли я видеть вывод журнала для аннотаций спящего режима (что-то вроде "Версия - Hibernate Annotations 3.4.0 GA)?
Ответы
Ответ 1
У меня есть более простая настройка с использованием конфигурации контекста следующим образом:
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>
Ответ 2
Я думаю, это говорит о том, что у вас проблема с версией. Версия JPA JAR, которая у вас есть, имеет другую сигнатуру метода от той, которую ожидает Spring. Попробуйте обновить JAR, чтобы использовать те из Spring и посмотреть, помогает ли это.