2011-12-01 23 views
6

Tôi có sau trong thiết lập thử nghiệm:Làm cách nào để đặt lại phương thức tĩnh giả trong Groovy?

def originalPostAsXml = RestClient.&postAsXml 

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

và trong dọn dẹp kiểm tra:

RestClient.metaClass.'static'.postAsXml = originalPostAsXml 

Nhưng khi chạy thử nghiệm tiếp theo, khi nó cố gắng để thực hiện RestClient.postAsXml, nó chạy vào một StackOverflowError:

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

Dường như RestClient.postAsXml đệ quy trỏ tới chính nó. Cách đúng để thiết lập lại một phương thức tĩnh giả lập là gì? gợi ý

+0

Dưới đây là một câu hỏi tương tự theo thời gian: http://stackoverflow.com/questions/920582/how-to-change-behaviour-of-the-methed-in-groovy-using -that-method-in-metaclass – schmolly159

+0

Bạn có thể đặt lại metaclass - Xem câu hỏi này có câu trả lời http://stackoverflow.com/questions/1612569/how-do-i-undo-meta-class-changes-after-executing -groovyshell –

Trả lời

1

schmolly159 của trên dẫn tôi đến các giải pháp sau đây:

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

sau đó để thiết lập lại phương pháp:

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

Trong một thử nghiệm đơn vị, tôi thường thiết lập các metaclass để null trong tearDown() mà dường như cho phép lớp học hoạt động như ban đầu mà không có sự sửa đổi của tôi.

dụ:

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 
} 

Nếu bạn đang sử dụng Junit4 bạn có thể sử dụng @AfterClass thay vì trong trường hợp này có ý nghĩa hơn có lẽ.

2

Tôi thấy rằng chỉ cần đặt <Class>.metaClass = null hoạt động cho tôi.

Spock Ví dụ:

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 
} 
Các vấn đề liên quan