2017-08-21 8 views
0

私は、テスト中のサービスにsessionFactoryが注入されていないため、HibernateSpecを拡張する単体テストが失敗しているという問題が発生しています。テスト中にsessionFactoryのメソッドが呼び出されると、NullPointerException(たとえばjava.lang.NullPointerException: Cannot invoke method getClassMetadata() on null object)となり、テストは失敗します。私はGrailsの3.2.4を使用していますし、5Grails 3.2を使用してユニットテスト用にsessionFactoryを注入しないのはなぜですか?

を休止テストは@TestMixin(HibernateTestMixin)を使用したときにこれが働いていたが、一部の更新で、ミックスインは廃止し、代わりにHibernateSpecを使用して提案しているように見えます。

ここで

は私のテストからの抜粋です:

class TestDatabaseServiceSpec extends HibernateSpec { 
    def setup() { 
    } 

    def cleanup() { 
    } 

    void "test method"() { 
     when: 
     service.method() 

     then: 
     true 
    } 
} 

そしてここでは、テスト中のサービスからの抜粋です:

void method() { 
... 
    TABLE_NAMES.add(sessionFactory.getClassMetadata('MyDomain').tableName) 
... 
} 

私はsetup方法と同様にsetupSpec方法でservice.sessionFactoryを設定しようとしていますテストではsessionFactoryが利用可能ですが、残念ながらそれは役に立たなかったのです。私は統合テストを使用することを考えましたが、以前と同じようにこの単体テスト作業を継続できるかどうかを本当に見たいと思います。誰かが私が何かを間違ってやっているのか、これに対する回避策/解決策があるのか​​知っていますか?

ありがとうございました!

+0

Grailsのその上で明示的にテストがあります。https://github.com/grails/gorm-hibernate5/blob/96cef6c569951f39b92715bb369056468b975535/grails-plugin/src/test/groovy/grails/test/mixin/hibernate/HibernateSpecSpec.groovy @Entity(MyDomain)注釈をスペッククラスに追加しようとすると、何らかのトリガーが働いて動作する可能性があります。 – bassmartin

+0

@bassmartinお返事ありがとうございます。注釈に値属性がないので、@Entity(MyDomain)は機能しません。また、(MyDomain)を使わずに試したところ、同じエラーが発生しました。 – Nick

答えて

0

はスペックに注釈@FreshRuntimeを追加すると(すなわち、SessionFactoryの(InstanceFactoryBean、SessionFactoryの、のSessionFactory))私のためsessionFactoryを設定し、テストにdoWithSpringクロージャを追加しました。また、setupSpecメソッドには、service.sessionFactory = sessionFactoryservice.transactionManager = transactionManagerの両方を必ず追加しました。最後に、私がテストしたいすべてのドメインオブジェクトを扱うためにgetDomainClasses()をオーバーライドする必要がありました。すべての助けをありがとう!

0

ソースコードを表示すると、HibernateSpecというヒントが得られます。使用しているHibernate 5 grailsプラグインには、getSessionFactory()メソッドが存在しない可能性があります。

私はorg.grails.plugins:hibernate5:6.0.6をgrails 3.2.5で使用していますが、sessionFactoryはユニットテストではnullではありません。

いつもアップグレードすることはできませんが、問題の原因を知ることができます。

更新:

service.sessionFactory = sessionFactory 

は、テスト・セットアップで呼び出さなければなりません。私の仕事は何

+0

ありがとうございます。私は 'HibernateSpec'をチェックして、' getSessionFactory() 'を見ました。また、私のアプリケーションをアップグレードして、grails 3.2.5を使用し、同じバージョンのhibernate5プラグインを使用しました。私はまた「サービス」と呼んだ。sessionFactory = sessionFactory'を 'setup'に、次に' setupSpec'に追加します。サービスにはTransactionalとマークされているので、 'service.transactionManager = transactionManager'も含めました。私はまだサービスのnull 'sessionFactory'のために同じNullPointerExceptionを参照しています。 – Nick

関連する問題