2 Stimmen

DbUnit: Problem mit Inkrement-ID-Generierung

Ich verwende DbUnit zusammen mit Unitils, was die meiste Zeit gut funktioniert.

Heute bin ich auf ein seltsames Problem gestoßen.

Situation ist:

  • Ich verwende Hibernate, und habe id mit "increment" Generator:

    <id name="Id"> <generator class="increment"/> </id>

  • Ich bereite einen Testdatensatz vor, bei dem die maximale ID 5 ist.

  • Ich verwende die Strategie des sauberen Einlegens.

  • Ich habe zwei Testmethoden test1 y test2 , die jeweils eine Zeile in dieser Tabelle hinzufügen.

  • Nach test1 Methode neu hinzugefügte Zeile hat id=6.

  • Nach test2 Methode neu erstellte Zeile hat id=7.

Das ist alles in Ordnung und ich verstehe, warum das so ist. Aus Sicht der Wartung ist es jedoch ein Problem. Wenn ich jemals eine dritte Testmethode zwischen den beiden hinzufüge, wird die Methode test2 plötzlich fehlschlagen, obwohl sich nichts geändert hat, nur weil die Zeile eine andere ID erhält.

Gibt es irgendwie kann ich DbUnit oder Hibernate erzwingen, um nächste id-Wert vor jeder Testmethode zu berechnen?

3voto

Bozho Punkte 570413

Die Lösung besteht darin, sich nicht auf generierte Kennungen zu verlassen:

  • Sie liegen außerhalb der Kontrolle Ihres Tests.
  • wenn Sie sie durch den Test kontrollieren lassen, testen Sie nicht mehr die zu testende Klasse

3voto

Adeel Ansari Punkte 38973

Als Erstes sollten Sie den vollständigen Datensatz bereitstellen, und zwar mit id auch. Wenn nicht, testen Sie nicht oder stützen Sie Ihren Test auf ids . Warum nicht testen? weil seine bereits gut getestet und zuverlässige Sache. Denken Sie immer daran, nie testen Drittanbieter-Bibliotheken, die meisten von ihnen bereits gut getestet. Aber es scheint ziemlich unmöglich, nicht abhängig von id s. Ich stimme zu, Sie sollten eine Mock-Klasse schreiben, um dieses Problem für Sie zu lösen, oder vielleicht können Sie eine Setter-Methode bereitstellen, um den Wert zu überschreiben, der von Ihrem eigenen erzeugt wird.

Die zweite Möglichkeit ist, den Testfall immer mit einer leeren Tabelle zu beginnen. Sie können eine Fixture schreiben, die die Tabelle vor jedem Testfall für Sie bereinigt.

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