wtorek, 2 czerwca 2009

HamCrest 1.2

Nie dawno pojawił się Hamcrest 1.2. Bardzo mi się podoba idea pisania assercji przy wykorzystaniu
Assert.assertThat(T arg0, Matcher<T> arg1)

Pozwala to nie tylko poprawić czytelność kodu, ale także go znacznie skrócić.
Na stronie domowej projektu jest parę przykładów użycia, ale lista ta jest trochę uboga i najlepiej samemu zacząć zabawę.

Sama konfiguracja pod Eclipse IDE zapowiadała się dość banalnie: wrzucamy hamcrest-all-1.2.jar do classpath i wszystko. Jednak czekała na mnie niemiła niespodzianka i zobaczyłem:java.lang.NoSuchMethodError. Okazuję się, jednak że Junit 4.4 (ten co działa z Spring TestContext Framework) ma sam w sobie okrojonego hamcresta...
Istenieje na szczęście "goły" JUnit4.4: junit-dep-4.4.jar. W takim razie usunąłem z classpath junit-4.4.jar a na jego miejsce podgrałem junit-dep-4.4.jar.
Od tego momentu pod Eclipse wszystko działa jak należy.

Jednak próba uruchomienia, a nawet kompilacji testów z wyrażeniami hamcrest nie działa.
Problem dotyczy Java generics i pojawiał się już wcześniej.
Następujący kod kompiluje się w IDE (jdk1.5.0_12)
Assert.assertThat(4, either(equalTo(4)).or(equalTo(3)));

Jednak odpalenie javac (uruchamiane z pełnej ścieżki do jdk1.5.0_12), wywala następujący błąd:
or(org.hamcrest.Matcher) in org.hamcrest.core.CombinableMatcher<java.lang.Object> cannot be applied to (org.hamcrest.Matcher<java.lang.Integer>)
Assert.assertThat(4, either(equalTo(4)).or(equalTo(3)));

Zgłosiłem issue, ale odpowiedz jest dość standardowa ze strony twórców projektu: "flaky Java generics". W takim razie pozostaję nam jedynie znaleźć workaround i pomóc kompilatorowi...
Assert.assertThat(4, Matchers.<Integer>either(equalTo(4)).or(equalTo(3)));


No i miało być tak pięknie, ale zaczęło się sypać uruchamianie testów z mavena.
Po wywaleniu junit-4.4 i dodaniu zależności do junit4.4-dep oraz hamcrest 1.2:

junit
junit-dep
4.4
true
test


org.hamcrest
hamcrest-core




org.hamcrest
hamcrest-all
1.2
test


SureFire uruchamiał testy nie jako testy JUnit4 a jako zwykłe POJO-tests.
Niestety dość długo zajęło znalezienie przyczyny, i nie obyło się bez. Na szczęście
szybciej poszło znalezienie rozwiązania

Brak komentarzy:

Prześlij komentarz