Usando i mock per impostare l'oggetto anche se non starai prendendo in giro alcun comportamento o verificando alcuna interazione con esso?

5

Quando costruisci un test unitario, è appropriato usare uno strumento di simulazione per aiutarti a configurare un oggetto anche se non stai prendendo in giro alcun comportamento o verificando alcuna interazione con quell'oggetto?

Ecco un semplice esempio in pseudo-codice:

//an object we actually want to mock
Object someMockedObject = new Mock(Object.class);
EqualityChecker checker = new EqualityChecker(someMockedObject);

//an object we are stubbing/mocking only to avoid figuring out how to instantiate or 
//tying ourselves to some constructor that may be removed in the future
ComplicatedObject someObjectThatIsHardToInstantiate = new Mock(ComplicatedObject.class);

//set the expectation on the mock
When(someMockedObject).equals(someObjectThatIsHardToInstantiate).return(false);
Assert(equalityChecker.check(someObjectThatIsHardToInstantiate)).isFalse();

//verify that the mock was interacted with properly
Verify(someMockedObject).equals(someObjectThatIsHardToInstantiate).oneTime();

È appropriato prendere in giro ComplicatedObject in questo scenario?

    
posta smp7d 17.04.2014 - 21:50
fonte

3 risposte

3

Non vuoi veramente un oggetto finto. Vuoi un mozzicone. Fondamentalmente vuoi un oggetto stupido che prende il posto di qualcosa di complesso in modo da poter controllare quel processo complesso senza doverlo verificare.

Mazze non sono stub (Martin Fowler)

    
risposta data 02.07.2014 - 21:52
fonte
1

Con Mockito , vorrei usare any() matcher .

When(someMockedObject).equals(any(ComplicatedObject.class)).return(false);

Potrebbe esserci qualcosa di simile nella tua struttura di derisione.

    
risposta data 17.04.2014 - 23:07
fonte
0

Se "non prenderai in giro alcun comportamento o verifichi alcuna interazione con quell'oggetto", sembra che tu non userai affatto quell'oggetto nell'unità sotto test, per quel test. Puoi semplicemente impostare il riferimento su null per quel test? Questo rende molto chiaro che questa dipendenza è irrilevante in questo test.

Se ciò non è possibile e si richiede che non sia nullo, significa che in effetti ci si aspetta qualche interazione con esso. Se il tuo caso d'uso non dovesse assolutamente interagire con esso, sembra che il codice sotto test abbia un problema di progettazione.

    
risposta data 03.05.2014 - 19:20
fonte

Leggi altre domande sui tag