2010-08-19 7 views
21

Entiendo la diferencia entre un Mock y un Stub.RhinoMock: Mocks Vs StrictMocks Vs DynamicMocks

Pero diferentes tipos de simulacros en el framework RhinoMock me confunden.

¿Podría alguien explicar los conceptos de Mocks Vs StrictMocks Vs DynamicMocks en términos de framework de RhinoMock.

sus respuestas son muy apreciadas.

Respuesta

28

Un simulacro estricto es un simulacro que lanzará una excepción si intenta utilizar cualquier método que no se haya configurado explícitamente para ser utilizado.

Una simulación dinámica (o suelta) no arrojará una excepción si intenta utilizar un método que no está configurado, simplemente devolverá nulo un valor predeterminado del método y continuará.

Se recomienda encarecidamente el uso de simulaciones dinámicas, ya que los simulacros estrictos generalmente resultan ser una pesadilla de mantenimiento. Here's a good blog post que tiene un ejemplo de código de estricto vs. dinámico, y por qué los simulacros estrictos suelen ser una mala idea.

+1

hilar fino -> "devolver null" debe ser algo así como "devuelve el valor predeterminado para el tipo de retorno" –

+0

@Merlyn Morgan-Graham - gran punto :) – womp

+0

@Merlyn Morgan-Graham: Muchas gracias chicos para la respuesta rapidísima. muy apreciado. –

-2

Muy en desacuerdo sobre este punto.

Podría decirse que el desarrollo basado en pruebas no es posible utilizando simulaciones dinámicas, porque lo que está probando no es necesariamente lo que está implementando.

Imagine que ha agregado un bucle foreach donde hizo una llamada db dentro del bucle. Esto escala muy mal. Si usó simulaciones dinámicas para burlarse de sus dependencias, es posible que se pierda la burla de las llamadas a bases de datos, por lo tanto, perderá el problema de escalabilidad, ya que no es necesario que se burle estrictamente de todas las llamadas a bases de datos.

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

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

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

Parece que no entiendes el propósito de los simulacros. Cuando se burla de algo, usted * expresamente * no está probando esa cosa en particular. Si te estás burlando del código DB, es porque no estás probando el código DB. –

+4

Su respuesta sería mejor si hubiera intentado responder la pregunta. – Gevious

+1

@AndrewBarber No estoy de acuerdo con Graham, pero creo que su punto es que debes preocuparte por * cómo * llamas al objeto burlado, no por lo que hacen los burlones. –

Cuestiones relacionadas