2013-09-05 14 views
10

Ho un EncouragementService.groovy con seguente metodoCome testare il servizio Grails usando Spock?

class EncouragementService { 
    def stripePaymentService 

    def encourageUsers(List<User> users){ 
    if(null != users && users.size()>0){ 
     for(User user : users){ 
     //logic 
     stripePaymentService.encourage(user) 
     // 
     } 
    } 
    } 
    } 

Per provare sopra il codice in JAVA universo, usando JUnit desidero innanzitutto creare due o tre utenti nella configurazione. Passa l'elenco degli utenti al metodo encourageUsers(...) e verifica quello che voglio con il risultato.

Come posso ottenere la stessa cosa qui a graal,

import com.github.jmkgreen.morphia.Datastore; 

@TestFor(EncouragementService) 
class EncouragementServiceSpec { 

    def morphiaService = new MorphiaService() 

    void testEncourageUsers() { 
     List<User> users = createUsers(); 
     encouragementService.(users) 
      // 
    } 

    def createUsers(){ 
     Datastore datastore = morphiaService.dataStoreInstance() 
     def user = new User() 
     user.setName("Prayag Upd") 
     // 
     datastore.save(user) 
     [user] 
    } 
} 

Sto usando spock:0.7

plugins { 
    test(":spock:0.7") { exclude "spock-grails-support" } 
} 

risposta

13

La classe di servizio può essere ottimizzato, come di seguito:

class EncouragementService { 
    def encourageUsers(List<User> users){ 
     if(users){ //Groovy truth takes care of all the checks 
      for(user in users){ 
      //logic 
      } 
     } 
    } 
} 

Spock Unit Test:
Spock prende test a tutto un altro livello, in cui è possibile testare il comportamento (aderisce al BDD). La classe di test sarà simile:

import spock.lang.* 

@TestFor(EncouragementService) 
@Mock(User) //If you are accessing User domain object. 
class EncouragementServiceSpec extends Specification{ 
    //def encouragementService //DO NOT NEED: mocked in @TestFor annotation 

    void "test Encourage Users are properly handled"() { 
     given: "List of Users" 
      List<User> users = createUsers() 

     when: "service is called" 
      //"service" represents the grails service you are testing for 
      service.encourageUsers(users) 

     then: "Expect something to happen" 
      //Assertion goes here 
    } 

    private def createUsers(){ 
     return users //List<User> 
    } 
} 
+0

"Patience" è [il mio nome] (http://www.ask.com/question/what-is-the-meaning-of-the-name-dhiraj), non sto scherzando;). Francamente parlando, recentemente ho avuto una [presentazione] (http://dmahapatro.github.io/bdd-grails-spock-presentation/#/) su spock nel gruppo locale Grails User, quindi ho pensato che mi sarei vantato di qualcosa che ho lavorato sopra. ;) @ SérgioMichels – dmahapatro

+0

@dmahapatro Quando 'User' non è un'entità basata su' grails-app/domain', ottengo 'Failure: test Gli utenti sono gestiti correttamente (np.zazzercode.service.EncouragementServiceSpec) | org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: impossibile aggiungere la classe Domain [class np.zazzercode.domain.User]. Non è un dominio! \t a grails.test.mixin.domain.DomainClassUnitTestMixin.registerGrailsDomainClass (DomainClassUnitTestMixin.groovy: 209) ' – prayagupd

+0

@PrayagUpd Sì, se l'utente non è una classe di dominio, allora non sarebbe necessario' @ Mock' questo è quello che volevo dire nella risposta. – dmahapatro

4

Utilizzare il build-test-data plugin per costruire gli utenti.

@TestFor(EncouragementService) 
@Build(User) 
class EncouragementServiceSpec extends Specification { 

    def "encourage users does x"() { 
    given: 
    def users = createUsers(); 

    when: 
    service.encourageUsers(users) 

    then: 
    // assert something 
    } 

    def createUsers(){ 
    [User.build(), User.build(), User.build()] 
    } 
} 

Ho anche fatto un paio di modifiche al codice per renderlo una specifica spock corretta. Il tuo test deve estendere la specifica e potresti voler familiarizzare con Spock's keywords.

+0

[build-test-dati dei plugin] (https://github.com/tednaleid/build-test-data) sembra impressionante, ma non sembra funzionare per non entità basate su 'grails-app/domain'. Genera eccezione 'org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: impossibile aggiungere la classe Dominio [class np.zazzercode.domain.User]. Non è un dominio – prayagupd

+0

Sì, funziona solo per le classi di dominio. – Nicholas

Problemi correlati