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.
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
Fügen Sie Benutzer.java ändert Ich musste einen Standard-Konstruktor ohne Argumente hinzufügen. Möglicherweise haben Sie bereits einen in der vollständigen eclipselink.weaving
property hinzu, wie auf EclipseLinkJpaVendorAdapter anstelle des HibernateJpaVendorAdapter-Problems User.java
-Klasse.
Tags und Links java spring-data-jpa hibernate spring-test bean-validation