2010-10-30 18 views
10

tienen un objeto de dominio Grails que tiene una función personalizada estática para tomar los datos de la base de datos¿Cómo se burla de un método estático de un objeto de dominio en Grails?

class Foo { 
    /* member variables, mapping, constraints, etc. */ 

    static findByCustomCriteria(someParameter, List listParameter) { 
     /* code to get stuff from the database... */ 

     /* 
      Return value is a map 
      ["one": "uno", "two": "due", "three": "tre"] 
     */ 
    } 

} 

La función estática findByCustomCriteria utiliza createCriteria() para construir la consulta que extrae datos de la tabla de Foo, lo que significa mockDomain(Foo) no funciona correctamente cuando pruebas de la unidad. Lo que intento hacer para evitar esto es usar uno de los métodos de burla para burlarse de findByCustomCriteria, pero no puedo entender bien la sintaxis.

Tengo un controlador BarController que estoy tratando de probar, y enterrado en la llamada al BarController.someFunction() hay una llamada al Foo.findByCustomCriteria().

class BarControllerTest extends ControllerUnitTestCase { 

    protected void setUp() { 
     super.setUp() 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testSomeFunction() { 

     /* Mocking for Foo goes here */ 

     assertEquals("someValue", controller.someFunction()) 
    } 
} 

¿Cuál sería una manera de burlarse de esto?

He intentado usar new MockFor(), mockFor() y metaClass, pero no puedo hacer que funcione.


Editar:

Cada vez que trataba de burlarse de esto, me trataron de burlarse de ella como tal ...

Foo.metaClass.'static'.findByCustomCriteria = { someParam, anotherParam -> 
    ["one": "uno", "two": "due", "three": "tre"] 
} 

supongo que no incluye información suficiente al principio.

+0

pone las cosas burlonas y tontas en ... eso es lo que tenemos que ver para ayudar – hvgotcodes

Respuesta

14

que he encontrado este escenario más de una vez, es necesario modificar el estática MetaClass de Foo:

Foo.metaClass.'static'.findByCustomCriteria = { someParameter, List listParameter -> 
    ["one": "uno", "two": "due", "three": "tre"] 
} 

Normalmente lo voy a poner en la configuración de la prueba, por lo que no se olvide cuando necesita ser aplicado.

+0

Esta solución no funciona. Estoy actualizando la pregunta en consecuencia. – haydenmuhl

+0

@haydenmuhl: Actualicé la solución para incluir un argumento explícito (había asumido que el parámetro implícito sería suficiente, pero tal vez no, cuál podría ser el problema (es decir, método sobrecarga la firma)). Inténtalo de nuevo. –

+0

Su solución probablemente habría funcionado, pero no incluí la información correcta en mi pregunta. La firma del método que estaba usando estaba mal. Realmente tomó un objeto y una lista, y me estaba burlando de tomar dos objetos. Actualizaré la pregunta. Si actualiza su respuesta, la seleccionaré como correcta. – haydenmuhl

4

En Grails 2.0 y superior, puede utilizar la clase GrailsMock como esto

def mockControl = new GrailsMock(MyDomainClass) 
mockControl.demand.static.get() {id -> return null} // Static method 
... 
mockControl.verify() 

Ver here.

Cuestiones relacionadas