0

ExpandoMetaClass를 사용하여 서비스를 통합 테스트에서 항상 성공으로 만들지 만 실제로 실패한 테스트를 하나 갖고 싶습니다. ExpandoMetaClass의테스트 당 클래스의 메타 클래스를 변경하는 방법

사용 예 :

static { 
     ExpandoMetaClass someService = new ExpandoMetaClass(Object, false) 
     someService.accessAnotherSystem = { return 'success' } 
     someService.initialize() 
     SomeService.metaClass = someService 
    } 

참고 : 현재 서비스 컨트롤러에 대해 정의하지만 즉 SomeServicesomeService.accessAnotherSystem() 같은 작품 잘라는 이름의 클래스를 참조하는 스프링 빈 이후에는 def someService에 없다되지 않는다 컨트롤러.

따라서 통합 테스트에서 controller.someService.metaClass.accessAnotherSystem = { return 'failure'}을 수행 할 수 없습니다.

메모 : 이것은 웹 플로우에 대한 통합 테스트입니다.

하나의 테스트를 위해 metaClass를 재설정 할 수 있습니까? 아니면 내가 원하는 것을 테스트 할 수 있습니까?

+0

이 통합 테스트에 그렇게 이상한 보이는,하지만 난 당신이 그것에 대해 스텁 사용한다고 생각 : http://spock-framework.readthedocs.org/en/latest/interaction_based_testing.html#stubbing – Philippe

+0

당신을 'def cleanup() {}'클로저를 사용하여 metaClass를 재설정 할 수 있습니다. – Abs

답변

0

테스트가 자체적으로 실행되면 아래에서 정상적으로 작동하지만 SomeService를 사용하는 다른 테스트가 실행되기 전에 ExpandoMetaClass가 재정의됩니다. 나는 그 문제에 대한 다른 질문을 시작할 것이다.

static { 
    ExpandoMetaClass someService = new ExpandoMetaClass(Object, false) 
    someService.invokeMethod = { String name, args -> 
     def result = 'success' 
     if(name.equals('accessAnotherSystem') 
     { 
      StackTraceUtils.sanitize(new Throwable()).stackTrace.each 
      { 
       if(it.methodName.equals('method_I_Want_failure') 
       { 
        result = 'exception' 
       } 
      } 
      return result 
     } 

     def validMethod = SomeService.metaClass.getMetaMethod(name, args) 
     if (validMethod != null) 
     { 
      validMethod.invoke(delegate, args) 
     } 
     else 
     { 
      SomeService.metaClass.invokeMissingMethod(delegate, name, args) 
     } 
    } 
    someService.initialize() 
    SomeService.metaClass = someService 
} 
관련 문제