3 Stimmen

Unit-Testing der JSR-303-Validierung in Spring

Ich versuche, einen Unit-Test für eine annotierte Bean in Frühling mit JSR-303-Validierung hinzuzufügen.

Die Bohne ist eine einfache Bohne wie diese:

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

In der Spring-Konfiguration habe ich alle notwendigen JAR-Dateien:

 validation-api  
 hibernate-validator

Der Validator wird mit initialisiert:

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

Mein Versuch eines Testkoffers sieht folgendermaßen aus (die Feder und andere Kleinigkeiten wurden entfernt):

@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);

}

Wenn ich diesen Test ausführe, erhalte ich den folgenden Stacktrace:

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)

Vermisse ich irgendwelche Abhängigkeiten? Ich verwende Hibernate mit JPA2-Annotationen als Persistenz, so dass alle diese JARs vorhanden sind und funktionieren.

Die Version von Hibernate ist:

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

Warum protokolliert Hibernate nicht die Version von hibernate-annotations? Laut der Dokumentation ist es von Hibernate 3.5 in hibernate3.jar gebündelt, das ich verwende.
Sollte ich die Protokollausgabe für Hibernate Annotations sehen (so etwas wie "Version - Hibernate Annotations 3.4.0 GA")?

11voto

Brian Matthews Punkte 8225

Ich habe einen einfacheren Aufbau mit folgender Kontextkonfiguration gewählt:

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-Kontext.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>

0voto

duffymo Punkte 298898

Ich denke, das bedeutet, dass Sie ein Versionsproblem haben. Die Version des JPA JAR, die Sie haben, hat eine andere Methodensignatur als die, die Spring erwartet. Versuchen Sie, die JARs zu aktualisieren, um die von Spring zu verwenden, und sehen Sie, ob das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X