2016-11-02 2 views
1

나는 내 수업이 테스트 케이스를 작성하려는 : 일반 메소드 호출과Spock : where 절에 다른 인스턴스를 전달하고 호출 횟수를 계산하려면 어떻게해야합니까?

  1. 테스트

  2. 난을 만든이를 위해 RuntimeException을

을 던졌습니다 메소드 호출과 테스트 다음 테스트. 그러나 불행히도 그것은 작동하지 않습니다 : 그것은 "너무 적은 호출"로 끝나고, 대신 하나가 0으로 끝납니다.

왜?

코드 :이 클래스 SimpleSpockTest는 "좋은"속성이 있거나없는 말을 실패 : 는 또한 내가 "공유"조명기하는 경우 "설정"을 이동하고 싶지만 그럴 수 없어

import spock.lang.Shared 
import spock.lang.Specification 

class SimpleSpockTest extends Specification { 

    interface Simple { 
     void run(); 
    } 

    @Shared 
    Simple good = Mock(Simple) 

    @Shared 
    Simple bad = Mock(Simple) 

    def "test invocations"() { 
     setup: 
     bad.run() >> { throw new RuntimeException() } 
     when: 
     instance.run() 
     then: 
     invocations * instance.run() 
     where: 
     instance | invocations 
     good  | 1 
     bad  | 1 

    } 

} 

PS "나쁜".

+0

이 테스트는 전혀 이해가되지 않는 것입니다. 무엇을 성취하려고합니까? 당신의 시나리오는 무엇입니까? – Opal

+0

오팔, 이것은 단순한 예입니다. 실제 테스트에서 나는 run 메소드에 의해 발생 된 1) 예외가 올바르게 등록되었는지 (예외를 던지는 모의가 필요한 이유, 예외 핸들러 호출을 계산할 수 있음) 2) 메소드 실행이 적절한 횟수 호출되었는지 확인하려고합니다. 이 테스트는 단순화 된 예제이지만 작동하지 않습니다. – MiamiBeach

답변

0

모의 객체는 원하는 방식대로 @Shared 필드로 작동하지 않습니다. Interaction Based Testing에 관한 Spock의 문서 :

상호 작용은 항상 특정 기능 방법으로 범위가 지정됩니다. 따라서 정적 메서드, setupSpec 메서드 또는 cleanupSpec 메서드에서 선언 할 수 없습니다. 마찬가지로 모의 객체는 static 또는 @Shared 필드에 저장하면 안됩니다.

즉, 피쳐 메서드 자체의 모의 객체를 정의해야합니다.

당신은 위의 제공 예 단순화 언급하지만, 가능하면, 다음과 같이해야 할 것이다 :

def "test invocations"() { 
    setup: 
    Simple good = Mock(Simple) 
    Simple bad = Mock(Simple) 
    bad.run() >> { throw new RuntimeException() } 

    when: 
    good.run() 
    bad.run() 

    then: 
    1 * good.run() 
    1 * bad.run() 
} 
관련 문제