Grails 3.3.11 でやってます。
シングルDBのマルチテナント
ここが参考になるで、参考しながら作成していたのですが、Unit試験が通らない。
以下のようなエラーが出る
|
Tenant could not be resolved outside a web request org.grails.datastore.mapping.multitenancy.exceptions.TenantNotFoundException: Tenant could not be resolved outside a web request at org.grails.datastore.mapping.multitenancy.web.SubDomainTenantResolver.resolveTenantIdentifier(SubDomainTenantResolver.groovy:43) at grails.gorm.multitenancy.Tenants.currentId(Tenants.groovy:73) at org.grails.orm.hibernate.AbstractHibernateDatastore.enableMultiTenancyFilter(AbstractHibernateDatastore.java:382) at org.grails.orm.hibernate.query.AbstractHibernateCriteriaBuilder.setDatastore(AbstractHibernateCriteriaBuilder.java:115) at org.grails.orm.hibernate.HibernateGormStaticApi.createCriteria(HibernateGormStaticApi.groovy:103) at org.grails.datastore.gorm.GormEntity$Trait$Helper.createCriteria(GormEntity.groovy:607) |
ガイドにあるように、
Specification -> HibernateSpec に変更しただけだとだめ。
ガイドは、ControllerUnitTest を implements しているが私のテストは、Service の試験。
なので、GrailsWebUnitTest を implements した。
|
@Integration @Rollback class XXXXXServiceSpec extends HibernateSpec { } |
を、
|
@Integration @Rollback class XXXXXServiceSpec extends HibernateSpec implements GrailsWebUnitTest { } |
しかし、まだまだエラーが。
|
java.lang.NullPointerException at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130) at grails.gorm.transactions.GrailsTransactionTemplate.executeAndRollback(GrailsTransactionTemplate.groovy:65) at grails.test.hibernate.HibernateSpec.setupSpec(HibernateSpec.groovy:46) |
なんか、Transaction 系ね。
というわけで、 create-integration-test で生成されたものをそのまま使っていたが、@Rollback の記載を取ったら動いた。
|
@Integration class XXXXXServiceSpec extends HibernateSpec implements GrailsWebUnitTest { } |
ちなみに、Rollback は試験の HibernateSpec により、試験毎に rollback されるので@Rollback は不要。
挙動を変えるには、isRollback() を Override して、false を返せば rollbackされない
|
@Override boolean isRollback() { return false } |
Service だけではく、Domain の試験でもこの方法で試験可能。
ただ、Domain の試験、MultiTenancyだと、unique が試験できなくなる。
これを解決するのは諦めた。