2013-09-05 19 views
10

私は最初のセットアップで二、三人のユーザーを作成することになるのJUnitを使用して、JAVAユニバースにコード上にテストするには、次の方法Spockを使ってGrailsサービスをテストするには?

class EncouragementService { 
    def stripePaymentService 

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

EncouragementService.groovyを有します。ユーザーのリストをencourageUsers(...)メソッドに渡して、結果に必要なものをチェックします。私はGrailsの中で、ここで同じことを達成するにはどうすればよい

、私はユーザーを構築するためにspock:0.7

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

答えて

13

サービスクラスは以下のように最適化することができます。

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

スポックユニットテスト:
スポックはあなたが動作をテストすることができます全体の別のレベル、(BDDに準拠)にテストをとります。テストクラスは次のようになります。

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

"忍耐"は[私の名前](http://www.ask.com/question/what-is-the-meaning-of-the-name-dhiraj)です、私は冗談ではありません;)。率直に言って、最近私はローカルのGrailsユーザグループのspock上で[プレゼンテーション](http://dmahapatro.github.io/bdd-grails-spock-presentation/#/)を持っていたので、私が働いていたことについて自慢していると思ったに。 ;)@SérgioMichels – dmahapatro

+0

@dmahapatro 'User'が' grails-app/domain'ベースのエンティティではない場合、 'Failure:test 'というユーザが正しく処理されます(np.zazzercode.service.EncouragementServiceSpec) | org.codehaus.groovy.grails.exceptions.GrailsConfigurationException:Domainクラス[class np.zazzercode.domain.User]を追加できません。それはドメインではありません! grails.test.mixin.domain.DomainClassUnitTestMixin.registerGrailsDomainClassで \t(DomainClassUnitTestMixin.groovy:209) ' – prayagupd

+0

は、いやが@PrayagUpdユーザーがドメインクラスでない場合、あなたは私が何を意味するのかであることMock' @'必要はありません答えに。 – dmahapatro

4

使用build-test-data pluginを使用しています

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

私はコードを適切なスポーク仕様にするためにいくつかの変更を加えました。あなたのテストは仕様を拡張しなければならず、あなたはSpock's keywordsに慣れておきたいかもしれません。

+0

[ビルドテストデータプラグイン](https://github.com/tednaleid/build-test-data)素晴らしい見えますが、非のために動作していないよう'grails-app/domain'ベースのエンティティです。 org.codehaus.groovy.grails.exceptions.GrailsConfigurationException:Domainクラス[class np.zazzercode.domain.User]を追加できません。ドメインではありません。 – prayagupd

+0

はい、ドメインクラスでのみ動作します。 – Nicholas

関連する問題