2014-01-17 4 views
7

Spock의 매력을 넓혀서이 문제에 착수하려고합니다. 실제로 Groovy 클래스에 대한 Unit Tests를 작성하려고 시도하지만 Java에 호출합니다. 정적 메서드는 개인 생성자를 호출합니다. 코드는 다음과 같습니다.Spock Mock에서 Java 생성자를 사용할 수 있습니다.

private MyConfigurator(String zkConnectionString){ 
    solrZkClient = new SolrZkClient(zkConnectionString, 30000, 30000, 
      new OnReconnect() { 
       @Override 
       public void command() { . . . } 
      }); 
} 

"SolrZkClient"는 타사 (Apache) Java 라이브러리에서 가져온 것입니다. ZooKeeper에 연결하려고하기 때문에 단위 테스트의 일부로 내부 테스트를 실행하는 대신이 Unit Test를 조롱하고 싶습니다.

내 시험은 어려움없이 생성자에 도달,하지만 난 그 ctor에 번번이 할 수

def 'my test'() { 
    when: 
     MyConfigurator.staticMethodName('hostName:2181') 
    then: 
     // assertions 
} 

이렇게 어쨌든이 있나요?

답변

8

테스트 대상 클래스가 Groovy로 작성되었으므로 전역 Groovy Mock/Stub/Spy (Spock Reference DocumentationMocking Constructors 참조)를 통해 생성자 호출을 조롱 할 수 있어야합니다. 그러나 더 좋은 솔루션은 MyConfigurator 클래스의 구현을 분리하여 테스트 할 수 있도록하는 것입니다. 예를 들어, SolrZkClient (또는 기본 인터페이스가있는 경우) 인스턴스를 전달할 수있는 두 번째 생성자 및/또는 정적 메서드를 추가 할 수 있습니다. 그런 다음 쉽게 모의를 할 수 있습니다.

+0

감사합니다 피터는 매우 '상식적인'조언처럼 보입니다. 이 답을 실제로 받아들이는 것을 지연시키는 것은 문제가되었습니다. 소량의 코드조차도 검사해야하는 이유가 있습니다. 이 클래스의 목적은 SolrCloud 구성의 기본 세부 사항을 숨기는 추상화입니다. 이러한 세부 사항을 '추상화'하려면 connectString 만 있으면됩니다. 따라서 클래스가 숨기려고하는 객체를 전달하는 것은 실제로 옵션이 아닙니다. 오늘이 시간을 더 보내고 다시 의견을 말하게 될 것입니다. – JoeG

+0

왜 두 번째 생성자를 추가 할 수 없습니까? –

+0

그것은 캡슐화를 깨뜨릴 것입니다. 클래스의 목적 중 하나는 호출 체인 위로 전달하지 않고 SolrZkClient의 생성을 숨기는 것입니다. – JoeG

관련 문제