2014-11-11 6 views
5

Ciao ho un controller chiamato ApiController che utilizza un servizio chiamato ApiService in questo modo:Grails Spock test Controller e il servizio

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

che funziona bene. Ma non riesco a scrivere un test per questo.

Questo è quanto ho ottenuto:

@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 

    } 

Da questo ottengo il seguente errore:

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

Questo è, ovviamente, perché non può vedere il mio fagiolo apiService. Quindi la mia domanda è: come faccio a farlo in Spock?

+0

come è il controller che connetterizza createCategory() sembra ... o fornisce una struttura dettagliata di quel controllo. –

risposta

7

E 'più probabile che fare con il Transactional bug: https://github.com/grails/grails-core/issues/1501

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

Si tratta di una soluzione temporanea (come per il commento bug report) ... questo ha funzionato per me :)

+0

Odio questo bug ... ma so che hanno molto sul loro piatto! – th3morg

+0

Grazie, ho pensato di non scoprire mai perché non funziona. – Roland

1

Questo è come vorrei farlo in Grails 2.4, senza annotazioni @Mock sulla classe spec:

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

ApiService è deriso con successo nei test, ma come stai fornendo il mock al controller? Le specifiche delle unità sono prive di DI, non puoi aspettarti che si autowire. Pertanto,

setup: 
controller.apiService = Mock(ApiService)