2011-12-01 15 views
6

Mam następujących w konfiguracji testowej:Jak zresetować wyśmiewaną metodę statyczną w Groovy?

def originalPostAsXml = RestClient.&postAsXml 

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

aw sprzątaniu testu:

RestClient.metaClass.'static'.postAsXml = originalPostAsXml 

Ale kiedy kolejne próby testowe, kiedy próbuje wykonać RestClient.postAsXml, działa w a StackOverflowError:

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

Wygląda na to, że RestClient.postAsXml rekurencyjnie wskazuje na siebie. Jaki jest właściwy sposób resetowania wyłudzonej statycznej metody? powyżej wskazówka

+0

Oto poprzednie podobne pytanie: http://stackoverflow.com/questions/920582/how-to-change-behaviour-of-the-methed-in-groovy-using -that-method-in-metaclass – schmolly159

+0

Możesz zresetować metaclass - Zobacz to pytanie, które zawiera odpowiedzi na http://stackoverflow.com/questions/1612569/how-do-i-undo-meta-class-changes-after-executing -groovyshell –

Odpowiedz

1

schmolly159 doprowadziły mnie do następującego rozwiązania:

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

następnie zresetować metody:

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

w badanej jednostki, często ustawione metaklasą do null w tearDown() który wydaje się pozwalać klasie pracować tak jak początkowo bez moich modyfikacji.

przykład:

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 
} 

Jeśli używasz JUnit4 można użyć @AfterClass zamiast w tej sprawie, która ma większy sens może.

2

Uważam, że działa po prostu ustawienie <Class>.metaClass = null dla mnie.

Spock Przykład:

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 
} 
Powiązane problemy