2014-12-02 12 views
10

Sono nuovo di JUnit e Hamcrest e vorrei ricevere consigli sulle best practice in modo da poter decidere quale documentazione studiare per prima.org.junit.Assert.assertThat meglio di org.hamcrest.MatcherAssert.assertThat?

Per i principianti, quali di questi metodi assertThat sono migliori?

  1. org.junit.Assert.assertThat (da junit-4.11.jar)
  2. org.hamcrest.MatcherAssert.assertThat (da hamcrest-core-1.3.jar)

Secondo una persona l'anno scorso, "JUnit has the assertThat method, but hamcrest has its own assertThat method that does the same thing.".

Secondo qualcuno all'inizio di quest'anno, Hamcrest "could potentially give better error messages because the matcher is called to describe the mismatch".

È difficile dire quali versioni di Junit e Hamcrest sono state confrontate in questi post. Quindi mi piacerebbe una raccomandazione basata sulle versioni rilasciate più recenti.

risposta

17

È il quasi la stessa identica cosa.

Le versioni recenti di JUnit ora includono hamcrest.

firma del metodo Infatti org.junit.Assert.assertThat s' è

public static <T> void assertThat(T actual, 
           org.hamcrest.Matcher<T> matcher) 

che si noterà utilizza matchers hamcrest.

Si può ancora voler includere la propria versione di hamcrest perché JUnit non viene aggiornato molto spesso e potrebbe non sempre utilizzare l'ultima versione di hamcrest.

Secondo il maven pom, JUnit 4.11 utilizza hamcrest 1.3 che ritengo sia il più attuale al momento in cui scrivo.

EDIT Ho appena letto il tuo secondo articolo http://blog.code-cop.org/2014/02/assert-or-matcherassert.html e descrive 2 lievi differenze nel hamcrest assertThat che lo rendono più utile:

  1. quando la partita non riesce, il messaggio di errore include ciò che è stato diverso invece di "X previsto ma era Y". matchers hamcrest personalizzati possono includere informazioni più dettagliate su cosa esattamente non andava implementando describeMismatch()
  2. La firma assertThat è diverso in hamcrest utilizzando T actual, Matcher<? super T> matcher che permette matchers di essere tipi super (come Matcher per confrontare interi e doppie). Questo di solito non ha importanza, ma quando ne hai bisogno questa è una caratteristica interessante.

Così utilizzare org.hamcrest.MatcherAssert.assertThat

+0

Grazie dkatzel, è stato utile sapere che JUnit non viene aggiornato molto spesso quindi potrei voler includere la mia versione di Hamcrest. È quel tipo di conoscenza che stavo cercando, quindi grazie ancora. –

+0

@MichaelOsofsky Ho aggiornato la mia risposta e ho scoperto che sono leggermente diversi, ora preferisco hamcrest. – dkatzel

+0

Grazie @dkatzel, è davvero d'aiuto. –

0

Un estratto da JUnit 5's User Guide:

Tuttavia, la classe di JUnit Giove org.junit.jupiter.Assertions non fornisce un metodo assertThat() come quella trovata in JUnit 4 di org.junit.Assert classe che accetta un Hamcrest Matcher .Invece, gli sviluppatori di sono incoraggiati a utilizzare il supporto integrato per i corrispondenti forniti da librerie di asserzioni di terze parti.

Penso che per JUnit 4, del Hamcrest assertThat è (ufficialmente) preferito.