2012-05-14 3 views
7

자바 라이브러리를 사용하는 그루비 코드를 테스트 중이며 네트워크를 사용하기 때문에 라이브러리 호출을 조롱하고 싶습니다. 그래서 테스트중인 코드는 같은 같습니다 나는 MockFor 및 StubFor를 사용하여 시도'new'연산자를 조롱하는 방법

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

을하지만 난 같은 오류를 얻을 : 내가 Grails를 2.0.3을 사용하고

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

합니다.

답변

5

MockFor's constructor의 두 번째 선택적 매개 변수는 interceptConstruction입니다. 이것을 true로 설정하면 생성자를 조롱 할 수 있습니다. 예 :

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" 
} 

그러나 이런 그루비 오브젝트 만 조롱 할 수 있습니다. Java 라이브러리가 붙어있는 경우 Java 객체의 생성을 팩토리 메소드로 가져 와서 조롱 할 수 있습니다.

8

각 테스트가 끝날 때 Grails 2가 MetaClass 수정으로 재설정되므로 MetaClass를 통해 항상 생성자를 덮어 쓸 수 있다는 것을 알았습니다.

이 속임수는 Groovy의 MockFor보다 좋습니다. AFAIK, Groovy의 MockFor은 JDK 클래스를 조롱하는 것을 허용하지 않습니다. 예를 들어 java.io.File입니다. 그러나 아래 예제에서는 이 아닌 Map이라는 실제 개체 유형으로 File file = new File("aaa")을 사용할 수 없습니다. 이 예제는 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" 
} 
관련 문제