2010-08-19 21 views
21

Je comprends la différence entre un Mock et un Stub.RhinoMock: Mocks vs StrictMocks vs DynamicMocks

Mais différents types de Mocks dans le cadre RhinoMock me confond. Est-ce que quelqu'un pourrait expliquer les concepts de Mocks Vs StrictMocks Vs DynamicMocks en termes de cadre RhinoMock.

vos réponses sont grandement appréciées.

Répondre

28

Un faux modèle est un faux qui déclenchera une exception si vous essayez d'utiliser une méthode qui n'a pas été explicitement configurée pour être utilisée. Un mock dynamique (ou lâche) ne lèvera pas d'exception si vous essayez d'utiliser une méthode qui n'est pas configurée, il retournera simplement null une valeur par défaut de la méthode et continuera.

Il est fortement recommandé d'utiliser des simulateurs dynamiques, car les simulacres rigoureux s'avèrent généralement être un cauchemar de maintenance. Here's a good blog post qui a un exemple de code de strict vs. dynamique, et pourquoi les simulacres stricts sont généralement une mauvaise idée.

+1

petite bête -> "return null" devrait être quelque chose comme "renvoie la valeur par défaut pour le type de retour" –

+0

@merlyn Morgan-Graham - excellent point :) – womp

+0

@merlyn Morgan Graham: Merci beaucoup les gars pour la réponse rapide comme l'éclair. très appréciée. –

-2

Pas du tout d'accord sur ce point. On peut soutenir que le développement piloté par les tests n'est pas possible en utilisant des simulateurs dynamiques, car ce que vous testez n'est pas nécessairement ce que vous implémentez. Imaginez que vous ayez ajouté une boucle foreach dans laquelle vous avez effectué un appel db à l'intérieur de la boucle. Cela échelles très mal. Si vous utilisiez des simulacres dynamiques pour se moquer de vos dépendances, vous risqueriez de rater les appels db, d'où l'absence de problème d'évolutivité car vous n'auriez pas besoin de vous moquer strictement de tous les appels db.

public void myMethod() 
{ 
    externalMethod1.doSomething(); 
    foreach() 
    { 
     externalDbCall.doSql(); 
    } 
} 

public void testMyMethodWithDynamicMocksPassesAndMissesDbCallInLoop() 
{ 
    expect(externalMethod1.doSomething(); 
} 

public void testMyMethodWithStrictMocksFailsAndHighlightsDbCallInLoop() 
{ 
    expect(externalMethod1.doSomething(); 
} 
+8

Vous ne semblez pas comprendre le but des simulacres. Quand vous vous moquez de quelque chose, vous ne faites pas de test sur cette chose particulière. Si vous vous moquez du code DB, c'est parce que vous ne testez pas le code DB. –

+4

Votre réponse serait meilleure si vous aviez essayé de répondre à la question. – Gevious

+1

@AndrewBarber Je ne suis pas d'accord avec Graham, mais je pense que son point de vue est que vous devriez vous préoccuper de * comment * vous appelez l'objet mocké, pas ce que les mock font. –