2013-09-05 9 views
10

Ben ilk kurulumunda iki veya üç kullanıcıları yaratacak, JAVA evrendeki kod yukarıda test etmek yönteminiGrails hizmeti Spock kullanarak nasıl test edilir?

class EncouragementService { 
    def stripePaymentService 

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

aşağıdaki JUnit kullanarak bir EncouragementService.groovy var. Kullanıcı listesini encourageUsers(...) yöntemine geçirin ve sonuçta ne istediğimi kontrol edin. Ben grails burada aynı şeyi elde edebilirsiniz nasıl

, ben kullanıcıları inşa etmek spock:0.7

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

cevap

13

Servis sınıfı aşağıdaki gibi optimize edilebilir:

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

Spock Birim Test:
Spock davranışını test edebilirsiniz bütün başka bir seviyede, (BDD yapışan) için test sürer. Test sınıfı olmazdı gibi:

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

"Sabır" [benim adım] (http://www.ask.com/question/what-is-the-meaning-of-the-name-dhiraj), şaka yapmıyorum;). Açıkçası, son zamanlarda yerel Grails Kullanıcı grubunda bir sunum yaptım (http://dmahapatro.github.io/bdd-grails-spock-presentation/#/), bu yüzden çalıştığım bir şey hakkında övüneceklerini düşündüm. üzerinde. ;) @ SérgioMichels – dmahapatro

+0

@ dmahapatro "Kullanıcı" bir "derecelendirme-uygulama/etki alanı" temelli varlık olmadığında, "Hata: sınama Kullanıcıları doğru şekilde işlenir (np.zazzercode.service.EncouragementServiceSpec) | org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Domain sınıfı eklenemiyor [class np.zazzercode.domain.User]. Bu bir alan değil! grails.test.mixin.domain.DomainClassUnitTestMixin.registerGrailsDomainClass at \t: Kullanıcı etki alanı sınıfı değilse (DomainClassUnitTestMixin.groovy 209) ' – prayagupd

+0

@PrayagUpd Evet, o zaman Mock' @ Kastettiğim olduğunu' gerek olmazdı cevapta. – dmahapatro

4

kullanın build-test-data plugin kullanıyorum

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] 
    } 
} 

.

@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()] 
    } 
} 

Aynı zamanda, kodun düzgün bir ayrıntı belirtmesi yapması için birkaç değişiklik yaptım. Testinizin Spesifikasyonu genişletmesi gerekiyor ve kendinizi Spock's keywords ile tanımak isteyebilirsiniz.

+0

[build-test verileri eklentisi] (https://github.com/tednaleid/build-test-data) harika görünüyor, ama olmayan için çalışmak görünmüyor "Grails-app/domain" tabanlı varlıklar. Atak istisnası 'org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Domain sınıfı eklenemiyor [class np.zazzercode.domain.User]. Bu bir Domain değil – prayagupd

+0

Evet, sadece etki alanı sınıfları için çalışıyor. – Nicholas