2011-01-17 3 views
3

Groovy는 다양한 선택을 제공하는 훌륭한 언어입니다.Groovy에서 Expando와 'as'연산자 및 클로저를 사용할 때가 언제됩니까?

단위 테스트를 생각해 볼 때 Expando 개체와 클로저를 사용하여 "as"연산자를 사용하는 것이 언제 합리적입니까?

http://groovy.codehaus.org/Developer+Testing+using+Maps+and+Expandos+instead+of+Mocks 간단한 경우를 들어 http://groovy.codehaus.org/Developer+Testing+using+Closures+instead+of+Mocks

대, 그들의 사용은 너무 비슷한 것 같다.

감사합니다.

+0

테스트중인 시스템 (SUT)에는 종속성이 있습니다. 지도를 사용하여 의존성을 조롱 한 다음 "as"연산자를 사용하여 입력합니다. "Mock 대신 Closure를 사용하는 개발자 테스팅"기사에서 언급했듯이 "인터페이스의 메소드와 같은 이름으로 사용되는 키와 함께 클로저 맵"을 사용합니다.이 경우 "인터페이스"는 의존; groovy/java 클래스이고 groovy/java 인터페이스는 아닙니다. – finneycanhelp

답변

4

mock 대신 클로저를 사용하는 것과 관련하여 언급 한 페이지에서 언급했듯이 그 자체만으로도 조롱 인터페이스 및 해당 인터페이스에 단일 메서드가있는 경우에만 작동합니다. 따라서 테스트중인 클래스가 인터페이스를 사용하지 않거나 하나 이상의 메소드를 모의해야하는 경우 Expando 또는 Map 중 하나를 사용해야합니다. 나는 항상 일관성 있고 항상 맵을 사용하는 것을 선호합니다. 제가 다루는 코드는 단일 인터페이스 메소드로 조롱 된 객체를 거의 필요로하지 않으며 맵을 사용하는 것은 더 많은 키 스트로크를 요구하지 않습니다. 이 객체를 조롱하는지도 나는 Expando를 사용하여 사이에 상당한 차이가 있지만가 새로운는 Expando에있는 단지 때문에 당신이 리터럴지도를 선언 할 수없는 좋은 방법의지도를 선호

interface Foo { 
    def someMethod(s) 
} 

// Closure, this breaks if someOtherMethod() is added to Foo or if Foo is a class 
def mockMethod = { arg -> ...} 
def myTestObject = new ObjectUnderTest(mockMetod as Foo) 

// Map 
def mockMethod = { arg -> ...} 
def myTestObject = new ObjectUnderTest([someMethod:mockMethod] as Foo) 

확실하지 않음 .

+0

멋진 코드 예제를 보내 주셔서 감사합니다! – finneycanhelp