Spring-Daten-jpa-Bean-Validierung in Junit-Tests

8

In meiner letzten Arbeit habe ich Spring-Data-jpa verwendet, um die bereitgestellten Repositories zu nutzen. Wenn es um Integrationstests ging, kann ich den Spring-Kontext zum Testen nicht konfigurieren und als Ergebnis funktioniert die Bean-Validierung in meinen Tests nicht.

Ich bin mir bewusst, dass ich Validator injizieren kann, und Unit-Test meine Anmerkungen, aber das ist nicht der Fall. Ich schreibe Integrationstests und möchte Repositories mit DB-Unterstützung testen.

Ich habe ein einfaches Projekt vorbereitet, um alle notwendigen Projektdateien zu zeigen.

Wenn ich Tests durchführe, scheitern zwei und ich habe keine Ahnung, warum der Hibernate-Validator im Klassenpfad vorhanden ist.

%Vor%

[..]

%Vor%

Quellcode und mvn test Ausgabe unten.

Vielen Dank im Voraus für Ihre Hilfe.

Java-Klassen (ich entkomme Kommentare, geters, seters, equals, hashCode, toString etc.):

BasisEntität

%Vor%

Benutzer

%Vor%

Rolle

%Vor%

UserRepositoryTest

%Vor%

Benutzerrepository

%Vor%

pom.xml

%Vor%

test-context.xml

%Vor%

mvn test Ausgabe

%Vor%

Gelöst

Nach der Antwort von @gunnar habe ich einen Änderungstest, um den Persistenzkontext nach repository.save zu löschen, und es funktioniert wie erwartet.

Änderungen am UserRepository

%Vor%

Lösung 2

Nach der Empfehlung von @andyb bin ich zu Eclipselink gewechselt und Tests funktionieren ohne zu spülen. Das ist die Lösung, die ich verwenden werde. Meiner Meinung nach ist es besser, die Implementierung zu wechseln, als eine Workaround zu verwenden.

    
pejas 23.04.2013, 15:06
quelle

2 Antworten

2

Ich habe es geschafft, das in der Frage genau beschriebene Problem lokal zu reproduzieren, allerdings nach dem Hinzufügen der fehlenden get / set Funktionen und der UserRepository Klasse: -)

Nach einigem Graben habe ich zwei bestehende Fragen JPA ConstraintViolation vs Rollback und Hibernate folgt den JPA-Spezifikationen in Kombination mit Bean Validation API nicht?

Beide scheinen zu dem Schluss zu kommen, dass Hibernate das ConstraintValidationException nicht korrekt ausgibt.

Das Ergebnis der zweiten Frage war ein Fehler HHH-8028 - entityManager.persist, der keine ConstraintValidationException ausgelöst hat gegen Hibernate.

Um zu bestätigen, dass dies das gleiche Problem war, wechselte ich zu einem einfachen @GeneratedValue und insertWrongEmail bestanden. insertToShortPassword ist immer noch fehlgeschlagen, aber ich habe das auf ein fehlendes @Size(min = 6) im Passwortfeld gesetzt. Nach dem Hinzufügen wurden alle Tests bestanden.

Zurück zu Ihrer konfigurierten @GeneratedValue Ich habe dann Hibernate für das EclipseLink-Persistenz-Framework ausgetauscht. Beide Tests bestanden, was die Entdeckung der vorherigen Fragen zu bestätigen scheint. Die Änderungen, die ich vorgenommen habe, waren:

pom.xml Änderungen fügen das jpa-Artefakt hinzu, wie auf der EclipseLink Seite

%Vor%

test-context.xml ändert

Wechseln Sie zu EclipseLinkJpaVendorAdapter

%Vor%

Fügen Sie eclipselink.weaving property hinzu, wie auf EclipseLinkJpaVendorAdapter anstelle des HibernateJpaVendorAdapter-Problems %Vor%

Benutzer.java ändert

Ich musste einen Standard-Konstruktor ohne Argumente hinzufügen. Möglicherweise haben Sie bereits einen in der vollständigen User.java -Klasse.

    
andyb 24.04.2013, 10:16
quelle
2

Das Löschen des Persistenzkontexts nach dem Ausführen der Repository-Operation könnte den Zweck erfüllen. JPA ruft die Bean-Validierung nur bei der Synchronisierung mit der Datenbank auf, d. H. Während des Commits oder einer Flush-Operation.

    
Gunnar 24.04.2013 09:50
quelle