2014-09-23 4 views
2

2 가지 방법 (하나는 공개이고 다른 하나는 보호 됨)이있는 서비스 클래스가 있습니다. 내 코드를 단위 테스트하려고합니다. 아래 코드 위의 단위 테스트 코드에서 MyServiceClass.groovy단위 테스트중인 서비스 클래스 내부의 메소드 모의

class MyServiceClass { 

     public boolean myMethod1() { 
      // some code 
      boolean success = myMethod2() 
      // some code 
     } 

     public boolean myMethod2() { 
      // some logic to return true/false 
      return true 
     } 

} 

MyServiceClassTests.groovy 

class MyServiceClassTests { 

     void testMyMethod1() { 
      // unit test code 
     } 

} 

, 나는 즉 myMethod1()에 의해 호출되는 myMethod2() 반환 결과를 조롱하려는 두 방법은 동일에 단위 테스트중인 서비스 클래스. 그것을 조롱하고 일을 끝내는 방법 ??

답변

1

테스트중인 클래스를 모의 수 없습니다. 그렇지 않으면 모의 테스트입니다.

myMethod2()을 다른 클래스로 옮기는 것이 더 나을 것입니다. MyServiceClasstrying to do too much인지 생각해보십시오. 당신은 1

새로운 서브 클래스를 생성()

옵션 myMethod2 이동이 필요하지 않는 답변을 요구했다

편집에 테스트중인 클래스가 될 수 있습니다 MyServiceClass 대신. 새 클래스가 MyServiceClass를 확장해야하고 myMethod2()을 무시하고 다른 "테스트 전용"구현을 제공 할 수 있습니다.

옵션 2

Mockito to Spy the class under test을 사용하는 것도 가능하지만, 이것은 오히려 정통 방식이다. 당신이

+0

왜 그렇게 할 수 없습니까? –

+1

테스트 할 때 "새로운"MyServiceClass()를 인스턴스화하여 테스트 할 "실제"코드를 실행해야하기 때문에. 따라서 동일한 클래스는 모의 객체가 될 수 없습니다. – Brad

+0

은 어떤 클래스로도 메서드를 이동하지 않고도이 iisue를 해결할 수있는 다른 방법입니다 ...? –

1

당신이 메타 클래스에 시도 해 봤나 컨트롤이있는 경우

나는 여전히 코드를 리팩토링하는 것이 좋습니다?

http://groovy.codehaus.org/JN3525-MetaClasses

service.metaClass.myMethod2 = { return whatever } 

내가해야보다 아마 더 메타 클래스를 학대하지만 당신은 일을 더 나은 방법을 마련 할 수없는 경우가 좋아요.