2011-12-01 6 views
6

tengo el siguiente en la configuración de la prueba:¿Cómo reinicio un método estático falso en Groovy?

def originalPostAsXml = RestClient.&postAsXml 

    RestClient.metaClass.'static'.postAsXml = { 
     String uriPath, String xml -> 
     return 65536 
    } 

y en la limpieza de prueba:

RestClient.metaClass.'static'.postAsXml = originalPostAsXml 

Pero cuando la siguiente prueba se ejecuta, cuando se trata de ejecutar RestClient.postAsXml, se topa un StackOverflowError:

at groovy.lang.Closure.call(Closure.java:282) 

parece que RestClient.postAsXml recursiva señala a sí mismo. ¿Cuál es la forma correcta de restablecer un método estático fallado? pista

+0

Aquí hay una pregunta similar anterior: http://stackoverflow.com/questions/920582/how-to-change-behaviour-of-the-methed-in-groovy-using -that-method-in-metaclass – schmolly159

+0

Puede restablecer la metaclase - Consulte esta pregunta que tiene respuestas http://stackoverflow.com/questions/1612569/how-do-i-undo-meta-class-changes-after-executing -groovyshell –

Respuesta

1

de schmolly159 anterior me llevó a la siguiente solución:

def originalPostAsXml = RestClient.metaClass.getMetaMethod('postAsXml', [String, String] as Class[]) 

a continuación para restablecer el método:

RestClient.metaClass.'static'.postAsXml = { String uriPath, String xml -> 
     originalPostAsXml.invoke(delegate, uriPath, xml) 
    } 
6

En una prueba de unidad, a menudo me puse la metaclase a null en el tearDown() cuales parece permitir que la clase funcione como lo hizo originalmente sin mis modificaciones.

ejemplo:

void setUp() { 
    super.setUp() 
    ServerInstanceSettings.metaClass.'static'.list = { 
     def settings = [someSetting:'myOverride'] as ServerInstanceSettings 
     return [settings] 
    } 
} 

void tearDown() { 
    super.tearDown() 
    ServerInstanceSettings.metaClass.'static'.list = null 
} 

Si está utilizando junit4 puede utilizar @AfterClass lugar en este caso, lo que hace más sentido tal vez.

2

Me parece que simplemente el ajuste <Class>.metaClass = null funciona para mí.

Spock Ejemplo:

def "mockStatic Test"(){ 
    given: 
    RestClient.metaClass.static.postAsXml = { 
    String uriPath, String xml -> 
    return 65536 
    } 

    when: 
    //some call that depends on RestClient.postAsXml 

    then: 
    //Expected outcomes 

    cleanup: 
    //reset metaclass 
    RestClient.metaClass = null 
} 
Cuestiones relacionadas