2015-03-11 14 views
45

Abbiamo una suite di test che utilizza principalmente asserzioni JUnit con i dispositivi di controllo Hamcrest. Uno dei nostri team ha iniziato a sperimentare con AssertJ e ha impressionato le persone con la sua sintassi, flessibilità e dichiarazione. C'è una funzione che JUnit fornisce che non riesco a trovare un equivalente in AssertJ: aggiungendo un messaggio di errore personalizzato.Puoi aggiungere un messaggio personalizzato ad AssertJ assertThat?

Stiamo spesso confrontando oggetti che non sono fatti per la leggibilità umana e avranno ID o UUID dall'aspetto casuale ed è impossibile dire cosa dovrebbero essere dai dati che contengono. Questa è una situazione inevitabile per il nostro codebase, purtroppo, come parte dello scopo che soddisfa è la mappatura dei dati tra altri servizi senza necessariamente capire di cosa si tratta.

In JUnit, il metodo assertThat fornisce una versione con un parametro String reason prima del parametro Matcher<T>. Ciò rende banale l'aggiunta di una breve stringa di debug che fa luce sul problema, come quello che il confronto dovrebbe significare per un essere umano.

AssertJ, d'altra parte, fornisce un jillion diverso genericized static assertThat metodi che restituiscono una qualche forma di interface Assert o una delle sue numerose classi di implementazione. Questa interfaccia non fornisce un modo standard per impostare un messaggio personalizzato da includere negli errori.

C'è un modo per ottenere questa funzionalità dall'API di AssertJ o una delle sue estensioni senza dover aggiungere create a custom assert class for every assert type?

risposta

73

E in modo classico, ho trovato quello che stavo cercando per pochi istanti dopo aver postato la domanda. Speriamo che questo renderà più facile per la prossima persona trovare senza dover prima sapere come si chiama. Il metodo magico è l'ingannevole nome abbreviato as, che fa parte di un'altra interfaccia che implementa AbstractAssert: Descriptable, non l'interfaccia di base Assert.

public S as(String description, Object... args)

imposta la descrizione di questo oggetto sostenere String.format(String, Object...) sintassi.
Esempio:

try { 
    // set a bad age to Mr Frodo which is really 33 years old. 
    frodo.setAge(50); 
    // you can specify a test description with as() method or describedAs(), it supports String format args 
    assertThat(frodo.getAge()).as("check %s's age", frodo.getName()).isEqualTo(33); 
} catch (AssertionError e) { 
    assertThat(e).hasMessage("[check Frodo's age] expected:<[33]> but was:<[50]>"); 
} 

Dove quella stringa citato nel blocco catch hasMessage è ciò che appare nella vostra unità log di uscita di test se l'asserzione fallisce.


ho trovato questo notando il failWithMessage helper nella custom assert page collegato in questione. Il JavaDoc per quel metodo indica che è protetto, quindi non può essere utilizzato dai chiamanti per impostare un messaggio personalizzato. Ha, tuttavia menziona il as aiutante:

Inoltre, questo metodo onora una descrizione impostato con as(String, Object...) o sovrascritto messaggio di errore definito dall'utente con overridingErrorMessage(String, Object...).

... e la overridingErrorMessage aiutante, che sostituisce completamente il messaggio standard AssertJ expected: ... but was:... con la nuova stringa fornita.

La home page di AssertJ non menziona alcun helper fino alla pagina di evidenziazione delle funzionalità, che mostra esempi dell'helper as nella sezione Soft Assertions, ma non descrive direttamente ciò che fa.

Problemi correlati