Quali sono le differenze tra mock e stub su Rhino Mock?


149

Non ho giocato abbastanza con questo e di solito uso i mock, ma mi chiedo quali sono le differenze tra questi due e quando usare l'uno o l'altro su Rhino Mock.

Aggiornare:

Ho anche trovato la risposta alla mia domanda nelle parole di Ayende :

La differenza tra stub e mock

Puoi ottenere l'effettiva definizione di questi termini in questo articolo: Mock non sono Stub . Voglio concentrarmi sulla differenza dal punto di vista di Rhino Mocks.

Un finto è un oggetto su cui possiamo impostare le aspettative e che verificherà che le azioni previste siano effettivamente avvenute. Uno stub è un oggetto che si utilizza per passare al codice in prova. È possibile impostare le aspettative su di esso, quindi agirebbe in determinati modi, ma tali aspettative non verranno mai verificate. Le proprietà di uno stub si comporteranno automaticamente come le normali proprietà e non è possibile impostare aspettative su di esse.

Se si desidera verificare il comportamento del codice in prova, verrà utilizzato un finto con le aspettative appropriate e verificarlo. Se vuoi solo passare un valore che potrebbe essere necessario agire in un certo modo, ma non è al centro di questo test, userai uno stub.

IMPORTANTE: uno stub non farà mai fallire un test.


Risposte:


148

Secondo questo

... In parole povere c'è una differenza tra oggetti Mock e Stub e RhinoMocks riconosce che ci consente di scrivere test che ne definiscono meglio lo scopo.

Gli oggetti simulati vengono utilizzati per definire le aspettative, ovvero: In questo scenario, mi aspetto che il metodo A () venga chiamato con tali e tali parametri. Le simulazioni registrano e verificano tali aspettative.

Gli stub, invece, hanno uno scopo diverso: non registrano o verificano le aspettative, ma piuttosto ci permettono di "sostituire" il comportamento, lo stato dell'oggetto "falso" al fine di utilizzare uno scenario di test ...


Ho trovato un altro post utile che fa eco allo stesso messaggio della risposta accettata per questa domanda: martinfowler.com/articles/mocksArentStubs.html .
singh1469,

20

In genere, Unit test chiama funzioni e metodi, quindi verifica se si è verificato il comportamento previsto. Queste funzioni e metodi potrebbero richiedere parametri. Usiamo stub e mock per soddisfare questi parametri. A volte potremmo anche deridere oggetti globali.

stubs

Uno stub è un piccolo oggetto falso che il test può utilizzare come parametro per far funzionare la chiamata di funzione. Questo ci consente di verificare il comportamento della funzione sotto test. Non ci consente di verificare alcun effetto collaterale, poiché lo stub non ha implementazione.

Mocks

Un Mock è uno stub con un'implementazione. Se la nostra funzione in prova interagisce con il nostro oggetto simulato, possiamo verificare che l'interazione simulata è stata interagita come previsto.

Ad esempio, supponiamo che avessimo un finto oggetto Utente e volessimo verificare che il nostro metodo session.login funzionasse, potremmo voler controllare che user.lastLoggedIn sia stato impostato. Potremmo creare un utente simulato che implementa questo metodo. Quando chiamiamo session.login, possiamo affermare che user.lastLoggedIn ha lo stato che ci aspettavamo.

Per riassumere

Un finto è uno stub con un'implementazione, che ci consente di testare gli effetti collaterali.

Questa differenza è ancora importante?

Un po 'come la differenza tra similitudini e metafore, la differenza tra tronconi e beffe è sottile e storica, e forse ha più a che fare con le diverse comunità e filosofie nel mondo dei test rispetto a qualsiasi grande differenza tecnica.

Rappresentano approcci leggermente diversi ai test. Un finto può essere scritto come uno stub. Di solito uno stub può essere espanso in un finto.

Quale dovresti usare?

Potresti scoprire che inizi a creare stub, quindi in seguito potresti scoprire che devi creare dei mock completi per alcuni dei tuoi oggetti. Potresti voler deridere tutto mentre vai, oppure potresti semplicemente deridere dove richiesto.


7

Differenza tra Mock e stub: con stub, correggi l'input del tuo test unitario: così il tuo test unitario non fa affermazione su stub e Stub riscrivendo l'implementazione di alcuni metodi risolvi il comportamento dell'oggetto falso. con Mock, correggi il risultato del tuo test unitario: così il tuo test unitario si aspetta dal tuo oggetto Mocking controllando l'interazione interna nel tuo oggetto simulato.


Sembra che tu stia dicendo che il tuo test dovrebbe "controllare" l'output di una simulazione. Se è quello che stai dicendo, non sei corretto. Una simulazione non dovrebbe essere testata; è lì così puoi testare altro codice. O la tua ultima frase significa qualcos'altro?
Andrew Barber,

1
Ciao Andrew, come ho scritto con Mock hai corretto l'output del tuo test in modo da non testarlo. Altrimenti ho scritto che Mock ti consente di controllare l'interazione (comportamento delle aspettative ... ;-)
Hassan Boutougha

1
OK, ha più senso. Grazie per il chiarimento!
Andrew Barber,

> non fa affermazioni su stub Perché in molte librerie di asserzioni esistono ancora metodi noti anche should have been called withper affermare stubparametri.
hellboy,

5

Nel caso del framework Moq, il metodo di installazione è STUB dove il metodo di verifica è Mock


0

Una cosa che ho notato anche è che quando uso MockRepository.GenerateMock, devo intercettare esplicitamente le aspettative su una chiamata di metodo specifica per intercettare quella chiamata. Con gli stub, sembra intercettare automaticamente qualsiasi metodo purché sia ​​virtuale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.