2014-11-11 3 views
5

안녕 난과 같이 ApiService라는 서비스를 사용 ApiController라는 컨트롤러를 가지고있다. 그러나 테스트를 작성할 수는 없습니다.는 Grails의 스팍 테스트 컨트롤러 및 서비스

이것은 내가 가지고 얼마나 멀리이다 : 나는 다음과 같은 오류가 이로부터

@TestFor(ApiController) 
@Mock([Category,ApiService]) 
class CategorySpec extends Specification { 

    def setup() { 
    } 

    def cleanup() { 
    } 

    void "test"() { 

     setup: 
     def apiService = Mock(ApiService) 

     when: 
     request.method = 'POST' 
     request.requestMethod = 'POST' 
     params.categoryID = 'test' 

     controller.createCategory() 

     then: 
     println(response) 
     1==1 

    } 

: 그것은 내 apiService 빈을 볼 수 없기 때문에

java.lang.NullPointerException: Cannot invoke method createCategory() on null object 

이 분명히입니다. 그래서 제 질문은 Spock에서 어떻게해야합니까?

when: 
    def serviceMock = mockFor(ApiService) 
    serviceMock.demand.createCategory { def params -> "output sample" } 
    controller.apiService = serviceMock.createMock() 
    controller.createCategory() 
+0

createCategory()를 사용하는 컨트롤러가 ... ... 또는 해당 컨트롤러의 자세한 구조를 어떻게 제공합니까? –

답변

7

: https://github.com/grails/grails-core/issues/1501

ApiService apiService = new ApiService() 
controller.apiService = apiService 
apiService.transactionManager = Mock(PlatformTransactionManager) { getTransaction(_) >> Mock(TransactionStatus) } 

이 (버그 보고서 주석에 따라) 임시 수정입니다 ...이 :

나를 위해 일했다
+0

이 버그를 증오해라. .. 그러나 나는 그들이 그들의 판 위에서 제비 뽑기를 얻었다라는 것을 알고있다! – th3morg

+0

감사합니다. 나는 그것이 작동하지 않는 이유를 결코 알지 못할 것이라고 생각했습니다. – Roland

1

이 내가 사양 클래스에 주석 @Mock하지 않고, Grails는 2.4에서 그것을 할 것 어떻게? 유닛 사양은 DI가 없기 때문에 자동 배선을 기대할 수 없습니다. 따라서,

그것은 Transactional bug 함께 할 가장 가능성
setup: 
controller.apiService = Mock(ApiService) 
0

ApiService 테스트에 성공적으로 조롱한다하지만 어떻게 당신이 컨트롤러에 모의를 제공하고 있습니다 :

관련 문제