2016-04-22 15 views
1

Ich habe hier ein kleines Problem zu kämpfen. Grundsätzlich haben wir eine Tabelle, in der eine Spalte keine PK ist, sondern eindeutig sein muss. Daher haben wir eine Unicity-Einschränkung hinzugefügt. Jetzt möchten wir in unserer Service-Schicht die Exception abfangen, die erzeugt wird, wenn jemand einen Datensatz erstellt, der diese Unicity-Einschränkung bricht, und den bereits vorhandenen Datensatz zurückgibt, anstatt einen neuen Datensatz zu erstellen.Arbeiten mit Hibernate ConstraintViolationException

Grundsätzlich sieht der Code wie folgt aus:

ObjectDto object = null; 
    try { 
     object = convertToDto(objectDao.create(convertToModel(pObject))); 
    } 
    catch (PersistenceException e) { 
     object= getByLabel(pObject.getLabel()); 
    } 
    return object; 

Diese ... funktioniert und zugleich nicht. Wir fangen richtig die Ausnahme und das Rück das abgerufene Objekt durch die getByLabel() -Methode, aber JUnit zeigt noch einen Fehler und damit unsere Unit-Tests nicht bestehen:

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement 

Gibt es eine andere Möglichkeit, diese usecases zu behandeln?

EDIT:

ObjectDto object = new ObjectDto(); 
object .setLabel("XXX"); 
object = objectService.create(object); 

ObjectDto object2 = new ObjectDto(); 
object2.setLabel("XXX"); 
object2 = objectService.create(object2); 
+1

Bitte teilen Sie Ihren Testcode sowie – CptBartender

+0

Ich hatte einen ähnlichen Fehler und wurde gemeldet, sagt etwas wie "konnte nicht commit", aber mein Commit war in Ordnung, überprüfen Sie Ihre Zeichenfolge Fehlermeldung und nichts tun, ist eine Option –

Antwort

1

mit diesem Beschriften Sie Ihre Testmethode:

@Test(expected=PersistenceException.class) 

so jUnit wird wissen, dass eine Ausnahme ausgelöst wird.

+3

Es löst tatsächlich das Problem, aber warum geht es sogar bis zur Testschicht, wenn ich sie in der Service-Schicht erwische? –

+1

Es sollte nicht in der Tat. Sind Sie sicher, dass Ihr Testcode nichts anderes tut, was diese Ausnahme auslösen kann? Kannst du es posten? – Aurasphere

+1

Ich würde argumentieren, dass dies Ihr Problem nicht löst. Es wird Ihren Test grün machen, aber Sie erwarten keine Ausnahme an dieser Stelle, sondern ein Objekt –