- Mock (programmation orientée objet)
-
En programmation orientée objet, les mocks (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[1],[2].
Le terme lui-même est emprunté au roman Alice au pays des merveilles de Lewis Caroll plus particulièrement de la tortue fantaisie (mock turtle) dans la version originale[2].Une traduction du terme mock par celui d'objet fantaisie, est proposé par certains[3].
Sommaire
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 elle 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 renvoie 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 [4] 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.
Références
- Endo-Testing: Unit Testing with Mock Objects » sur http://connextra.com, 2000. Consulté le 19/06/2010 Tim Mackinnon, Steve Freeman, Philip Craig, «
- Philippe Blayo, « Des substituts d'objets avec EasyMock », dans GNU/Linux Magazine France, no 123, janvier 2010, p. 92-98
- ObjetFantaisie sur http://wiki.agile-france.org, décembre 2004
- (en) Roy Osherove, The art of unit testing, Greenwich, Manning, 2009, 1re éd. (ISBN 978-1-933988-27-6) (LCCN 2009455864), « Interaction testing with mock objects et seq »
Wikimedia Foundation. 2010.