# Mock (programmation orientée objet)

En programmation orientée objet, les mocks (simulacres ou mock object) sont des objets simulés qui reproduisent le comportement d'objets réels de manière contrôlée. Un programmeur crée un mock dans le but de tester le comportement d'autres objets, réels, mais liés à un objet inaccessible ou non implémenté. Ce dernier est alors remplacé par un mock.
Le concept a été utilisé pour la première fois lors de la conférence XP 2000, dans un article de Tim Mackinnon, Steve Freeman et Philip Craig intitulé Endo-Testing: Unit Testing with Mock Objects$^,$. Le terme lui-même est emprunté au roman Alice au pays des merveilles de Lewis Carroll plus particulièrement de la Fausse Tortue (ou Tortue Fantaisie, en anglais The Mock Turtle) dans la version originale.
Une traduction de l'expression mock object par celle d'objet fantaisie, est proposée par certains. Une définition de l'adjectif mock étant not real but appearing or pretending to be exactly like something, on pourra lui préférer celle d'objet factice (mais on perdrait alors la référence amusante).

## Motifs d'utilisations

Dans un test unitaire, les mocks peuvent simuler le comportement d'objets réels et complexes et sont utiles à ce titre quand ces objets réels sont impossibles à utiliser. On peut citer les cas suivants :
* Remplacer un comportement non déterministe (l'heure ou la température ambiante).
* Si l'objet a des états difficiles à reproduire (une erreur de réseau par exemple).
* Si l'initialisation de l'objet est longue (ex. : création d'une base de données).
* Si l'objet n'existe pas ou si son comportement peut encore changer.
* S'il est nécessaire d'inclure des attributs et des méthodes uniquement à des fins de test.
Par exemple, un programme d'alarme qui produira une sonnerie à une heure donnée. Pour le tester, le programme devra attendre l'heure prévue afin de vérifier que la sonnerie se produit. Si un mock est utilisé, celui-ci pourra être déréglé en vue de simuler l'heure de déclenchement de la sonnerie.

## Détails techniques

Un mock a la même interface que l'objet qu'il simule autorisant ainsi l'objet client à ignorer s'il interagit avec un objet réel ou un objet simulé. La plupart des frameworks d'utilisation de mock permettent au programmeur de spécifier quelles méthodes vont être appelées et dans quel ordre elles le seront. De même pour les paramètres qui vont leur être passés. Les valeurs retournées par le mock seront aussi définies par le programmeur. Ainsi, le comportement d'un objet complexe tel qu'un socket de réseau pourra être simulé par le mock, permettant ainsi au programmeur d'étudier le comportement de son objet dans une large variété d'états auxquels il pourra être confronté.

### Mock, objets factices et bouchons

Certains auteurs font une distinction entre les mocks et les objets factices (fake). Les objets factices sont les plus simples des deux, ils implémentent la même interface que l'objet qu'ils représentent et renvoient des réponses prédéfinies. Ainsi, un objet fake fournit un ensemble de méthodes bouchon.
Dans le livre The Art of Unit Testing, les mocks sont décrits comme des objets factices permettant de décider si un test a été passé, en vérifiant si l'interaction avec un objet s'est produite ou non. Tous les autres objets sont des bouchons. Les objets factices correspondent à tout ce qui n'est pas réel. En utilisant cette terminologie, ils sont à la fois les bouchons et les mocks.
Dans cette acception, les mocks en font un peu plus : l'implémentation de leurs méthodes contiennent des affirmations. Ceci veut dire qu'un véritable mock examinera le contexte des appels de méthode qui seront faits, par exemple en effectuant des tests sur les données passées en tant qu'argument des appels.