2014-11-11 8 views
5

Hallo Ich habe einen Controller ApiController genannt, die einen Dienst ApiService wie so genannte verwendet:Grails Spock Test-Controller und Service

def createCategory(){ 
     def jsonObj = request.JSON 
     jsonObj.each{ key, value -> 
      params.put(key,value) 
     } 
     render apiService.createCategory(params) 
} 

der gut arbeitet. Aber ich kann nicht scheinen, einen Test dafür zu schreiben.

Dies ist, wie weit ich habe:

@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 

    } 

Daraus ich die folgende Fehlermeldung erhalten:

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

Dies ist natürlich, weil es nicht meine apiService Bohne sehen kann. Also meine Frage ist, wie mache ich das in Spock?

+0

Wie ist Ihr Controller, der createCategory() sieht ... oder geben Sie eine detaillierte Struktur dieses Controllers. –

Antwort

7

Es ist höchstwahrscheinlich mit den Transactional bug zu tun: https://github.com/grails/grails-core/issues/1501

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

Dies ist eine temporäre Lösung (gemäß dem Fehlerbericht Kommentar) ... für mich gearbeitet hat :)

+0

Hasse diesen Fehler ... aber ich weiß, dass sie eine Menge auf dem Teller haben! – th3morg

+0

Danke, ich dachte, ich würde nie herausfinden, warum es nicht funktioniert. – Roland

1

Dies ist, wie ich es in Grails tun würde, 2.4, ohne Anmerkung @Mock auf der spec Klasse:

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

ApiService ist erfolgreich im Test verspottet aber wie Sie die Mock an die Steuerung bereitstellt? Die Gerätespezifikationen sind ohne DI, Sie können nicht erwarten, dass es sich automatisch dreht. Daher

setup: 
controller.apiService = Mock(ApiService)