Mock object
# Mock object

Nella programmazione orientata agli oggetti, i mock object (oggetti simulati od oggetti mock) sono degli oggetti simulati che riproducono il comportamento degli oggetti reali in modo controllato. Un programmatore crea un oggetto mock per testare il comportamento di altri oggetti, reali, ma legati ad un oggetto inaccessibile o non implementato. Allora quest'ultimo verrà sostituito da un mock.

Questo concetto è stato utilizzato per la prima volta durante la conferenza XP 2000, in un articolo di Tim Mackinnon, Steve Freeman e Philip Craig intitolato Endo-Testing: Unit Testing with Mock Objects.

## Utilizzo

Nei test di unità, i mocks possono simulare il comportamento degli oggetti reali e complessi e sono utili quando gli oggetti correlati sono impossibili da utilizzare. Si possono citare i seguenti casi:

* Rimpiazzare un comportamento non deterministico (l'ora o la temperatura ambiente).
* Se l'oggetto ha degli stati difficili da riprodurre(un errore di sistema ad esempio).
* Se l'inizializzazione dell'oggetto è lunga (es. : creazione di un database).
* Se l'oggetto non esiste o se il suo comportamento può ancora cambiare.
* Se è necessario d'includere degli attributi e dei metodi unicamente a fini di test.

Per esempio, un programma d'allarme che produrrà una suoneria ad una determinata ora. Per testarlo, il programma dovrebbe aspettare l'ora prevista al fine di verificare che la suoneria s'inneschi. Utilizzando un mock, questo potrà essere de-regolato per simulare l'ora di innesco della suoneria.

## Dettagli tecnici

Un mock ha la stessa interfaccia dell'oggetto che simula, autorizzando così l'oggetto client a ignorare se interagisce con un oggetto reale o simulato. Quasi tutti i frameworks che utilizzano i mock permettono al programmatore di specificare quali metodi saranno chiamati e in quale ordine saranno eseguiti. Anche i parametri che verranno passati. I valori ritornati dal mock saranno anche questi definiti dal programmatore. Così, il comportamento di un oggetto complesso come un socket potrà essere simulata dal mock, permettendo al programmatore di studiare il comportamento del suo oggetto in una larga varietà di stati ai quali potrà essere confrontato.

### Mock, fakes e stubs

Alcuni autori fanno distinzione tra i mock e gli oggetti fittizi (fake).Gli oggetti fittizi sono i più semplici tra i due, implementano la stessa interfaccia dell'oggetto che rappresentano e inviano delle risposte predefinite. Anche un oggetto fake fornisce un insieme di metodi stub.

Nel libro The Art of Unit Testing, i mock sono descritti come degli oggetti fittizi che permettono di decidere se un test è stato passato, verificando se l'interazione con un oggetto si produce o meno. Tutti gli altri oggetti sono stubs. Gli oggetti fittizi corrispondono a tutto ciò che non è reale. Utilizzando questa terminologia, sono sia stubs che mocks.

In questo senso, i mocks hanno qualcosa in più: l'implementazione dei lori metodi contiene delle affermazioni. Questo vuol dire che un vero mock esaminerà il contesto delle chiamate dei metodi che saranno fatti, per esempio effettuando dei test sui dati passati come argomenti della chiamata.

