2010-05-04 9 views
9

Usiamo gli stub scritti a mano nei nostri test di unità e sto esplorando la necessità di un framework Mock come EasyMock o Mockito nel nostro progetto.Perché abbiamo bisogno di strutture di simulazione come Easymock, JMock o Mockito?

Non riesco a trovare un motivo valido per passare a framework Mocking da stub scritti a mano.

Qualcuno può rispondere per quale motivo si potrebbe optare per strutture di derisione quando stanno già facendo test unitari usando mock/stub scritti a mano.

Grazie

+0

Inoltre, vedere http://stackoverflow.com/questions/1717107/why-do-we-need-mocking-frameworks – Finglas

risposta

2

ho iniziato allo stesso modo (la scrittura prende in giro a mano) e ormai mi sono quasi del tutto passa ad EasyMock.

Trovo che l'utilizzo di EasyMock sia in genere più veloce e più flessibile.

In genere la prima volta che ho bisogno di una simulazione, posso averla in un paio di righe di codice con EasyMock, mentre a mano ho bisogno di implementare l'interfaccia necessaria (abbastanza corretto, questo può essere generato da un IDE come IntelliJ) e quindi aggiungere il codice necessario per produrre la risposta necessaria e/o per consentire di rilevare gli effetti delle chiamate ad esso.

Bene, si potrebbe dire, questo è un costo una tantum. La prossima volta potrò semplicemente riutilizzare la mano scritta finta felice ... ho scoperto che spesso non è il caso. In un altro test potrei aver bisogno di una simulazione della stessa classe con un comportamento diverso. Per esempio. vengono chiamati diversi metodi e/o si aspettano risultati diversi. Un caso specifico è quando si presume che il mock lanci un'eccezione in un caso di test, ma non in un altro. Bene, posso aggiungere alcuni parametri che controllano il comportamento in modo dinamico. Quindi per il prossimo test, alcuni parametri per controllare un maggior comportamento ... quindi finisco con un'implementazione fittizia sempre più complicata, che è una dipendenza per sempre più test unitari - anche il rischio di interrompere inavvertitamente i test più vecchi.

Contrariamente a ciò, con EasyMock posso configurare i miei mock in modo indipendente per ogni test. Pertanto, il comportamento è esplicitamente controllato e visibile all'interno del codice di test unitario stesso e non vi è alcun rischio di effetti collaterali.

Per non parlare del fatto che con EasyMock è possibile verificare che i metodi richiesti siano richiamati nell'ordine richiesto, se è necessario (e lo faccio, di tanto in tanto). Implementare questo a mano (soprattutto in modo generico) sarebbe piuttosto un dolore al collo, senza alcun beneficio aggiunto.

1

A volte potrebbe essere più semplice creare mock in modo dichiarativo e può aiutare a scrivere alcuni tipi di comportamenti più facilmente utilizzando la struttura che a mano. Un altro piccolo vantaggio potrebbe essere anche il fatto che usando la struttura di derisione si è espliciti riguardo al beffardo.

2

Proprio come ogni altro sviluppatore, mi trovo a scrivere codice anziché utilizzare la soluzione esistente: la sindrome "non inventata qui".

La tua domanda suggerisce che preferisci scrivere le classi di cui hai bisogno per simulare/simulare due volte invece di usare un framework che lo faccia per te. Usare una struttura di derisione ti libera dalla necessità di scrivere, refactare e aggiornare i tuoi mock arrotolati a mano ogni volta che cambi l'oggetto simulato.

In altre parole, l'uso di un framework di simulazione è come qualsiasi altra libreria di terze parti, ad es. ORM - qualcun altro ha scritto il codice in modo da non doverlo fare.

9

Si consiglia di leggere l'articolo Mocks Aren't Stubs di Martin Fowler.La differenza fondamentale è questa:

  • Il compito di uno stub è quello di restituire risultati noti a tutte le chiamate
  • un mock si aspetta inoltre chiamate a venire in un ordine specifico, con i parametri specifici, e sarà un'eccezione quando queste aspettative non sono soddisfatti

Ci sono alcune condizioni di errore che non possono essere testate con stub. D'altra parte, i test che utilizzano i mock sono spesso molto meno stabili.

Mentre gli stub possono essere scritti manualmente con uno sforzo ragionevole, Mocks richiederebbe molto più lavoro. E una buona struttura di derisione può rendere gli stub di scrittura più veloci e più semplici.

+0

Piccolo punto, l'articolo di Martin sta diventando un po 'vecchio ora e manca alcuni punti critici. Innanzitutto, non penso che nessuno dei quadri attuali imponga l'ordine di invocazione a meno che tu non lo chieda.In secondo luogo, se i test sono instabili, questo è un feedback utile che dovrebbe farti dare un'altra occhiata al tuo progetto. –

13

La semplice risposta è no necessario.

Né abbiamo bisogno di altri quadri esistenti, ma l'utilizzo di strutture di simulazione rende le nostre vite più facili. Come sviluppatori possiamo dedicare più tempo al problema, piuttosto che creare o realizzare ciò che le strutture di derisione possono fare.

"non trovo un motivo valido per passaggio a quadri di scherno da mano stub scritte."

Ero esattamente lo stesso. Perché dovrei preoccuparmi di imparare un quadro beffardo? Gli stub scritti a mano vanno bene.

Alcuni punti vengono in mente, principalmente il fatto che dopo un po 'i test diventano oscuri con gli stub di test. A cosa ti riferisci quando usi stub scritti a mano sono conosciuti come estensioni di test. Estendi il codice per abilitare le strutture di simulazione. In altre parole, si scrive codice per lo stub o si restituiscono valori in base a ciò che accade. Questo richiede tempo e impegno. Per non parlare dello spazio. Un quadro beffardo può fare tutto questo in una questione di linee.

I vantaggi di un quadro di scherno sono:

  • Più facile (soggettivo, ma dopo un po 'non sarà possibile scrivere a mano le implementazioni scritte)
  • meno codice (quadri consentono di creare un mock in una questione di linee, piuttosto che dichiarazioni di classe pieno)
  • segue SECCO (non finirà per ripetere le implementazioni finte)

Il vantaggio maggiore si ha quando si richiedono oggetti finti. Dovendo scrivere il codice a mano per verificare se un metodo è stato chiamato, quante volte e così via è un mini task in sé. Se qualcun altro lo ha fatto e ha creato un framework ben documentato e ben testato, non avrebbe senso non usarlo. Proprio come qualsiasi struttura, puoi andare avanti senza di essa, ma a volte usando lo strumento giusto rende il lavoro molto più semplice.

+1

Come accennato, vale la pena di controllare l'articolo * "Mock not stubs * *. Le strutture di derisione consentono derisione, stub e falsificazione. In altre parole, sono molto versatili. – Finglas