2014-12-31 4 views
2

일부 Java 코드를 테스트하기 위해 Groovy로 작성된 Spock 테스트를 사용하고 있습니다. Spock은 Groovy 클래스를 조롱하기 때문에 JMockit을 사용하여 Java 코드에서 메소드를 조롱했습니다. JMockit MockUp이 테스트 사이에 지속되는 문제가 있습니다. 이러한 mock 인스턴스는 테스트 (JMockit 문서 별)에 대해서만 존재해야하지만 작동하지 않습니다. JMockit 테스트 러너와 Spock 테스트 러너를 사용하지 않았기 때문에 상상할 수 있습니다.Spock 테스트 사이에 지속되는 JMockit MockUp

내가 직면 한 문제 중 가장 간단한 예는 다음과 같습니다. 문자열을 반환하는 간단한 메서드가 있는데 MockUp 메서드의 반환 값을 변경할 수는 있지만 사용하지 않을 세 번째 테스트에는 여전히 존재합니다. ClassToTest.method() 여전히 문자열 "조롱"가 아니라 "원래"반환하기 때문에

자바 클래스

public class ClassToTest { 
    public String method() { 
     return "original"; 
    } 
} 

스팍 테스트

class ClassToTestSpec extends Specification { 
    void "first test"() { 
     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "original" 
    } 

    void "second test"() { 
     setup: 
     new MockUp<ClassToTest>() { 
      @Mock 
      public String method() { 
       return "mocked" 
      } 
     } 

     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "mocked" 
    } 

    void "third test"() { 
     when: 
     String result = new ClassToTest().method() 

     then: 
     result == "original" 
    } 
} 

세 번째 테스트는 실패합니다. 디버거를 사용하여 Mocked 메서드가 두 번 호출됨을 확인했습니다.

질문

수동 JMockit에서 클래스 MockUp을 제거하는 방법이 있습니까? 감사.

+0

Spock은 Java 및 Groovy 클래스를 모방 할 수 있습니다. 테스트중인 클래스를 조롱하는 것은 냄새이며주의해서 사용해야합니다. –

+0

@PeterNiederwieser 응답 주셔서 감사합니다. 정상적인 표기법 인'instance.method() >> result'를 사용할 수 없습니다. 올바른 방향으로 나를 가리킬 수 있습니까? – mnd

+0

표기법이 작동하지 않는 스크래치는'ClassToTest instance = Mock (ClassToTest)'와 같이 객체를'Mock '으로 인스턴스화하는 것을 잊었다. 이제 이것을 스파이와 함께 부분 모의로 만드는 방법을 찾아야합니다. – mnd

답변

2

생성 된 모형 객체에서 MockUp.tearDown 메소드를 호출하여 수동으로 효과를 실행 취소 할 수 있습니다.

+0

원더풀! 감사합니다 @ Logerio! – mnd

+0

개인적으로 spock 테스트에서 tearDown 메소드를 사용하여 운이 없었습니다. 누군가가이 작업을한다면, 예제 스펙을보고 싶습니다. 감사. 지금은 spock에서 Jmockit을 피하고 있습니다. – keaplogik

1

정확하게 질문에 대한 답변이 아닙니다. JMockit의 MockUp을 수동으로 제거 할 수 있는지 여부는 아직 모르니까요. 그러나 @ PeterNiederwieser의 의견 덕분에, 당신은 실제로 자바 클래스의 부분 모의 객체를 생성 할 수 있다는 것을 알게되었습니다. 아래는 위에서 두 번째 테스트로의 변경 사항입니다.

void "second test"() { 
    setup: 
    ClassToTest test = Spy(ClassToTest) { 
     method() >> "mocked" 
    } 

    when: 
    String result = test.method() 

    then: 
    result == "mocked" 
} 

피터는 Spy() 필요한 경우 테스트하는 방법과 무엇을 재검토 언급,하지만 내 사용 사례이 바람직하다.