2012-04-18 7 views
19

Estoy escribiendo un ensayo para MethodA() en una clase de servicio similar al que se da a continuación.Grails: ¿Cómo hago otros métodos simulacros de una clase bajo prueba que se podría llamar internamente durante las pruebas

Class SampleService { 
    def methodA(){ 
    methodB() 
    } 

    def methodB(){ 
    } 
} 

Cuando la prueba MethodA(), que deben ser capaces de burlarse de la llamada a methodB() cuando se prueba MethodA(). Estoy usando la versión 2.0.x de los griales. En las distribuciones 1.3.x, me gustaría escribir una maqueta auto como éste

def sampleServiceMock = mockFor(SampleService) 
sampleServiceMock.demand.methodB { -> } 

Pero esto no funciona en las versiones 2.0.x. Me preguntaba ¿cuáles son las otras formas de burlarse methodB() cuando se prueba MethodA()

+0

¿Alguien sabe cómo hacer esto para Grails 3.2.8 con Spock? – nbkhope

Respuesta

34

Para este tipo de problema en realidad evito burla y el uso de la capacidad incorporada de groovyProxy para echar un mapa de cierres como un objeto proxy. Esto le da una instancia con algunos métodos sustituidos, pero otros pasa a través de la clase real:

class SampleService { 
    def methodA() { 
     methodB() 
    } 

    def methodB() { 
     return "real method" 
    } 
} 

def mock = [methodB: {-> return "mock!" }] as SampleService 

assert "mock!" == mock.methodA() 
assert "real method" == new SampleService().methodA() 

me gusta que sólo cambia una instancia, se puede hacer en una sola línea, y no perder el tiempo con la metaclase de cualquier cosa fuera de esa instancia que deba ser limpiada.

+1

Sí, esto parece una gran manera de comportamientos burlones. Todavía extraño a la capacidad de auto maqueta usando griales mockFor() :( –

+0

Esto solucionó mis problemas de prueba griales, gracias tanto! – EdgeCaseBerg

+0

brillante. Esto me, así como la prueba de que tuve fue la creación de cierres Spock ayudó y fue incapaz de hacer valer los valores reales devueltos por el controlador (cuando se burla de una llamada de servicio). –

12

Hay una gran cantidad de burlarse de alternativas con maravillosa. Se puede ver parte de la documentación de Groovy Mocks, using Maps and Expandos instead of Mocks o using Closures instead of Mocks.

En su ejemplo, voy a utilizar las capacidades de metaprogramación maravilloso.

void testMethodA() { 
    service = new SampleService() 
    service.metaClass.methodB = { -> return "what you want" } 
    service.methodA() 
    assert "your condition" 
} 
+2

Finalmente utilicé este enfoque para burlarse. Pero, semánticamente hablando, cambiar la firma de una clase para hacer un pase de prueba parece extremo :) –

+0

Y el metacass también cambia a otras pruebas. –

+0

Los enlaces (Groovy Mocks, usando Maps y Expandos en lugar de Mocks o usando Closures en lugar de Mocks) ya no funcionan, corríjalos o bórrelos. Gracias. – GSAN

Cuestiones relacionadas