2016-03-30 22 views
7

新しいGrails 3.1.4角度プロジェクトと、RestfulControllerを拡張するいくつかのドメインオブジェクトとコントローラを作成しました。以下の統合テストを作成しました。私はapplication.ymlで設定したデータソースを持っていますGrails 3の統合テストでtransactionManagerエラーが発生しません

package com.waldoware.invoicer 

import grails.test.mixin.integration.Integration 
import grails.transaction.* 
import spock.lang.* 

@Integration 
@Rollback 
class BillingEntityRestControllerIntegrationSpec extends Specification { 

    def setupData() { 
     def biller = new BillingEntity() 
     biller.with { 
      companyName = "Acme, Inc." 
     } 
     def ledger = new Ledger(name: "My Ledger", billingEntity: biller).save(failOnError: true, flush: true) 
    } 

    void 'test all entities'() { 
     when: 
     setupData() 
     new BillingEntityRestController().index() 

     then: 
     response.contentType == 'application/json;charset=UTF-8' 
     response.status == HttpServletResponse.SC_OK 
     response.text == "[{}]" 
    } 
} 

::私はgrails test-app -integrationを実行すると、私はエラーに

java.lang.IllegalStateException: No transactionManager was specified. Using @Transactional or @Rollback requires a valid configured transaction manager. If you are running in a unit test ensure the test has been properly configured and that you run the test suite not an individual test method. 
    at grails.transaction.GrailsTransactionTemplate.<init>(GrailsTransactionTemplate.groovy:60) 
    at com.waldoware.invoicer.BillingEntityRestControllerIntegrationSpec.$tt__$spock_feature_0_0(BillingEntityRestControllerIntegrationSpec.groovy:29) 
    at com.waldoware.invoicer.BillingEntityRestControllerIntegrationSpec.test all entities_closure2(BillingEntityRestControllerIntegrationSpec.groovy) 
    at groovy.lang.Closure.call(Closure.java:426) 
    at groovy.lang.Closure.call(Closure.java:442) 
    at grails.transaction.GrailsTransactionTemplate$1.doInTransaction(GrailsTransactionTemplate.groovy:70) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133) 
    at grails.transaction.GrailsTransactionTemplate.executeAndRollback(GrailsTransactionTemplate.groovy:67) 
    at com.waldoware.invoicer.BillingEntityRestControllerIntegrationSpec.test all entities(BillingEntityRestControllerIntegrationSpec.groovy) 

Testクラスを取得

environments: 
    development: 
     dataSource: 
      dbCreate: none 
      url: jdbc:h2:./devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 
    test: 
     dataSource: 
      dbCreate: update 
      url: jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 
    production: 
     dataSource: 
      dbCreate: update 
      url: jdbc:h2:./prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE 
      properties: 
       jmxEnabled: true 
       initialSize: 5 
       maxActive: 50 
       minIdle: 5 
       maxIdle: 25 
       maxWait: 10000 
       maxAge: 600000 
       timeBetweenEvictionRunsMillis: 5000 
       minEvictableIdleTimeMillis: 60000 
       validationQuery: SELECT 1 
       validationQueryTimeout: 3 
       validationInterval: 15000 
       testOnBorrow: true 
       testWhileIdle: true 
       testOnReturn: false 
       jdbcInterceptors: ConnectionState 
       defaultTransactionIsolation: 2 # TRANSACTION_READ_COMMITTED 
+1

私が統合テストを望む唯一の理由は、単体テストの下で呼び出されないカスタムJSONマーシャラーがあることです。 –

+0

あなたはこれを考え出したことがありますか? Grails 2アプリケーションを移行し、いくつかの統合テストで同じ問題が発生するのを見ています。 – Rado

+0

@rado私はgsonに有利なカスタムマーシャラーを削除しました。これはGrails 3のやり方です:-) –

答えて

3

これはあなたが持っていない場合は助けることができますトランザクションマネージャを設定するbuild.gradleで設定された永続性プラグイン(例:hibernate4,mongodb、またはgrails-app/conf/application.ymldataSourceが設定されていない場合などです。

この場合、@Rollbackアノテーションを削除するだけで問題を解決できます。

+3

テスト実行が他のテストのためにデータベースを汚染しないように、 '@ Rollback'を保持したいと思います。私はロールバックを削除しようとしましたが、テストの実行時にこのエラーが発生しました: 'org.springframework.dao.DataAccessResourceFailureException:現在のHibernateセッションを取得できませんでした。ネストされた例外はorg.hibernate.HibernateExceptionです:現在のスレッドに対してセッションが見つかりません ' –

関連する問題