Die aktuellen IDEA Demetra builds haben jetzt eine eingebaute Unterstützung f�r JUnit 4. Da das TestNG-Plugin schon seit längerer Zeit nicht mehr aktualisiert wurde und nie so gut in IDEA integriert war wie das JUnit-Plugin, habe ich mich für eines meiner privaten Projekte entschieden wieder zu JUnit 4 zurückzuwechseln.
Das Zurückwechseln von TestNG zu JUnit 4 ist ziemlich leicht, weil JUnit 4 die Annotations von TestNG imitiert und TestNG die Assert-Klasse von JUnit verwendet. Der Wechsel war also schnell getan. Nun wollen wir mal sehen, ob alle Tests noch laufen. Unter TestNG taten sie das. … Na ja, wer hätte was anderes erwartet. Unter JUnit 4 gibt es Fehler. Der erste ist:
java.lang.AssertionError: expected:<1> but was:<1>
at org.junit.Assert.fail(Assert.java:58)
at org.junit.Assert.failNotEquals(Assert.java:259)
at org.junit.Assert.assertEquals(Assert.java:80)
at org.junit.Assert.assertEquals(Assert.java:88)
...
Das ist ja merkw�rdig. Was geht hier vor. Der Test sieht so aus:
assertEquals(1, ingredient.getFromAmount(0).getAmount());
Und ein paar Zeilen früher gibt es einen Test, der sehr ähnlich aussieht. Der funktioniert aber:
assertEquals(1, ingredient.getConversionsCount());
Was geht hier also vor. Irgendwo in meinem Kopf geht ein Licht an. Ein Blick in die Assert-Klasse bestätigt den Verdacht. Es gibt keine assertEquals Methoden für ints und longs mehr. Die braucht man ja auch nicht mehr. Autoboxing kommt zum Einsatz. Aber selbst mit Autoboxing sollte es funktionieren, oder? Nicht unbedingt. ingredient.getFromAmount(0).getAmount() gibt einen long zurück, der dann in ein Long autoboxed wird. 1 wird in einen Integer autoboxed. Da new Long(1).equals(new Integer(1)) false zurückgibt, muss der Test scheitern.
Ich denke, dass die JUnit Leute hier etwas vorschnell die assertEquals Methoden entfernt haben. Sie zu lassen, wo sie waren, hätte nicht geschadet. Sie entfernt zu haben, wird die Migration von Projekten von JDK1.4/JUnit 3 auf JDK 5/JUnit 4 erschweren.
Die L�sung des Problems ist es die 1 explizit als long zu markieren:
assertEquals(1l, ingredient.getFromAmount(0).getAmount());
Nun werden beide — sowohl der erwartete als auch der tats�chliche Wert - zu Longs autoboxed und alles ist gut..



Leave a comment