2012-05-14 21 views
7

Estoy probando algún código groovy que usa una biblioteca java y quiero simular las llamadas a la biblioteca porque usan la red. Así que el código bajo prueba se ve algo como:Cómo burlarse del operador 'nuevo'

def verifyInformation(String information) { 
    def request = new OusideLibraryRequest().compose(information) 
    new OutsideLibraryClient().verify(request) 
} 

He intentado utilizar MockFor y StubFor pero me da errores tales como:

No signature of method: com.myproject.OutsideLibraryTests.MockFor() is applicable for argument types: (java.lang.Class) values: [class com.otherCompany.OusideLibraryRequest] 

que estoy usando Grails 2.0.3.

Respuesta

5

El segundo parámetro opcional para MockFor's constructor es interceptConstruction. Si configura esto como verdadero, puede simular el constructor. Ejemplo:

import groovy.mock.interceptor.MockFor 
class SomeClass { 
    def prop 
    SomeClass() { 
     prop = "real" 
    } 
} 

def mock = new MockFor(SomeClass, true) 
mock.demand.with { 
    SomeClass() { new Expando([prop: "fake"]) } 
} 
mock.use { 
    def mockedSomeClass = new SomeClass() 
    assert mockedSomeClass.prop == "fake" 
} 

Tenga en cuenta, sin embargo, que solo puede burlarse de objetos geniales como este. Si está atascado con una biblioteca Java, puede extraer la construcción del objeto Java en un método de fábrica y simular eso.

8

Acabo de encontrar que siempre podemos sobrescribir un constructor a través de MetaClass, ya que Grails 2 se restablecerá la modificación de MetaClass al final de cada prueba.

Este truco es mejor que el MockFor de Groovy. AFAIK, Groovy's MockFor no nos permite burlar las clases de JDK, por ejemplo, java.io.File. Sin embargo, en el ejemplo siguiente, no puede usar File file = new File("aaa") ya que el tipo de objeto real es Map, no File. El ejemplo es una especificación de Spock.

def "test mock"() { 
    setup: 
    def fileControl = mockFor(File) 
    File.metaClass.constructor = { String name -> [name: name] } 
    def file = new File("aaaa") 

    expect: 
    file.name == "aaaa" 
} 
Cuestiones relacionadas