2014-05-09 4 views

risposta

34

Entrambi ottenere lo stesso risultato. L'utilizzo di un'annotazione (@Mock) viene solitamente considerato "più pulito", in quanto non si riempie il codice con assegnazioni di tipo standard che sembrano tutte uguali.

Nota che, al fine di utilizzare il @Mock annotazione, la classe test deve essere annotato con @RunWith(MockitoJUnitRunner.class) o contenere una chiamata a MockitoAnnotations.initMocks(this) nel suo metodo @Before.

+1

Non dimenticare @InjectMocks –

+0

E non dimenticare i nomi falsi nei messaggi di errore. Quindi i due non ottengono lo stesso risultato. –

8

La differenza è nelle righe di codice necessari per scrivere :) :) :)

Seriamente, usare le annotazioni ha lo stesso effetto dell'uso di Mockito.mock.

Per citare la documentazione del MockitoAnnotations l'uso delle annotazioni ha i seguenti vantaggi:

  • permette la creazione stenografia di oggetti necessari per il test.

  • Riduce al minimo il codice di creazione simulato ripetitivo.

  • Rende la classe di test più leggibile.

  • Rende più facile leggere l'errore di verifica perché il nome del campo è
    utilizzato per identificare la simulazione.

Javadoc per MockitoAnnotations è here

+0

Trovo strano dire stenografia. Sì, richiede meno caratteri, ma richiede più linee. –

+1

Nel contesto della stenografia dello sviluppo del software ho sempre interpretato la stenografia nel senso che devo scrivere meno codice :) – geoand

+1

@RogerCSWernersson - puoi mettere l'annotazione sulla stessa riga, le annotazioni non richiedono una nuova riga successiva. – Tasgall

4

Entrambi sono considerati uguali e ottenere la stessa cosa, ma io preferirei la seconda:

@Mock è un'annotazione che:

  • Minimizza ripetitivo codice di creazione finta.
  • Rende la classe di test più leggibile.
  • Consente la creazione di oggetti in forma abbreviata per il test.
2

Ci sono due vantaggi significativi nell'utilizzo dell'annotazione.

  • Un finto realizzato con @Mock può essere iniettato nella classe si sta testando, utilizzando il @InjectMocks annotazione. Questa è una tecnica potente che può rendere il test molto più semplice. Semplicemente non funzionerà con i mock creati con il metodo mock.
  • In caso di errori che riguardano la tua simulazione, il nome della simulazione apparirà nel messaggio. Se hai usato @Mock, questo nome sarà solo il nome del campo. Questo rende molto facile trovare il problema come un mock.

Naturalmente, oltre a questi due importanti vantaggi, molte persone trovano la notazione @Mock molto più leggibile, e lo fa ridurre la quantità di codice. Non vedo alcuna ragione per non usarlo.

0

La risposta alla domanda è un grosso errore. Abbiamo appena risolto alcuni problemi causati da Mockito.mock (Your.class) come campo. Abbiamo avuto pochi metodi @Test. Il 4 ° metodo lanciava un'eccezione con "thenThrow (ex)". Tutti i metodi @Test dopo il fallimento e il motivo è stata l'eccezione generata. Stavano condividendo l'istanza derisa e la condizione "quando". Dopo abbiamo cambiato da

TestClass testInstance = Mockito.mock(TestClass.class); 

a

@Mock 
TestClass testInstance; 

tutto ha cominciato a funzionare come previsto. Quindi Mockito.mock sta creando una simulazione condivisa tra i metodi di test e @Mock no.

+1

Questo non è corretto. Se usi '@ Mock', devi usare' MockitoAnnotations.initMocks (this) 'nel' @ Before', che equivale a scrivere 'Mockito.mock (Some.class)' nello stesso '@Before 'metodo di installazione. (quindi il simulato viene ricreato prima di ogni test e il problema che hai descritto va via) – Andrejs

+0

potrebbe andare via ma questa è una differenza principale. – saferJo

Problemi correlati