2014-01-05 3 views
2

을 조롱에 무슨 문제 :스팍이 인터페이스 다음 감안할 때

interface Bundle { 
    String getName() 

    String getVersion() 
} 

과 같은 방법 :

String log(Bundle b) { 
    return "${b.getName()}: ${b.getVersion()}" 
} 

이 스팍 테스트가 실패 : 여기

def "my test"() { 
     given: 
     def bundle = Mock(Bundle) 
     bundle.getName() >> "name" 
     bundle.getVersion() >> "1.0.0" 

     when: 
     def x = log(bundle) 

     then: 
     x == "name: 1.0.0" 
     1 * bundle.getName() 
     1 * bundle.getVersion() 

    } 

오류입니다 :

condition not satisfied: 
x == "name: 1.0.0" 
| | 
| false 
| 8 differences (27% similarity) 
| n(ull): (null-) 
| n(ame): (1.0.0) 
null: null 

두 가지 확인 (1 * bundle.getName()1 * bundle.getVersion())을 제거하면 테스트가 녹색으로 바뀝니다.

내 코드에 어떤 문제가 있습니까?

답변

2

조롱 동일한 호출 스터 빙합니다 (giventhen 또는 블록 중 어느 하나)이 함께 발생해야 다음에 Spock Reference Documentation

... 
then: 
1 * bundle.getName() >> "name" 
1 * bundle.getVersion() >> "1.0.0" 
x == "name: 1.0.0" 

Combining Mocking and Stubbing 더 자세하게 설명한다.

다른 방법으로는 조롱하는 부분 (1 * bundle.getName() 등)을 없애는 것입니다.이 부분은 꼭 필요한/도움이되지는 않을 것입니다.

+0

이 경우 여러 테스트 방법에서 사용되는 일반적인 조롱을 사용할 수 없습니다. 예를 들어, "setup"방법에서 조롱 상호 작용을 생성 한 다음 여러 테스트 방법에서 스터 빙합니다. 내가 맞습니까? – mhshams

+2

당신은 모든 상호 작용을 오버라이드 할 수 있다는 점에서 옳습니다 (그리고 그것은'then' 블록에서 발생해야합니다). 비웃는 부분을 먼저 선언하고 스텁 부분을 나중에 선언 할 수 없습니다 (동일한 상호 작용의 경우). –