grails - 为什么没有为使用 Grails 3.2 的单元测试注入(inject) sessionFactory?

标签 grails grails-orm spock

我遇到了一个问题,即扩展 HibernateSpec 的单元测试由于 sessionFactory 而失败。没有被注入(inject)到被测服务中。每当 sessionFactory 上的方法在测试期间被调用,我得到一个 NullPointerException (例如 java.lang.NullPointerException: Cannot invoke method getClassMetadata() on null object )并且测试随后失败。

我正在使用 Grails 3.2.4 和 Hibernate 5。

当测试使用 @TestMixin(HibernateTestMixin) 时,这是有效的,但看起来有一些更新,mixin 已被弃用并建议使用 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)
...
}

我试图设置service.sessionFactorysetup方法以及setupSpec使用 sessionFactory 的方法在测试中可用,但不幸的是这并没有帮助。我曾考虑过使用集成测试,但我真的很想看看我是否可以像以前一样继续让这个单元测试工作。有谁知道我做错了什么,或者是否有解决方法/解决方案?

谢谢!

最佳答案

查看HibernateSpec的源代码可以给出一些提示。可能没有getSessionFactory()您正在使用的 Hibernate 5 grails 插件中的方法。

我正在使用 org.grails.plugins:hibernate5:6.0.6使用 grails 3.2.5 和 sessionFactory 在单元测试中对我来说不是空的。

我了解并非总是可以升级,但它可以让您了解问题的根源是什么。

更新:

service.sessionFactory = sessionFactory

也必须在测试设置中调用。

关于grails - 为什么没有为使用 Grails 3.2 的单元测试注入(inject) sessionFactory?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45801766/

相关文章:

java - Grails:模拟 hibernate 代理进行测试

java - 如何保持 Java 属性文件可读

hibernate - Grails:生成自定义 ID

Grails hasOne 关联

Grails/GORM 默认获取策略 : When to set fetchMode to "eager"?(急切与懒惰)

java - 在 Groovy 中使用 if-else 语句 - spock 测试

java - 如何 stub Spring 存储库以在集成测试中抛出异常?

validation - Grails项目中集成测试的Spock验证问题

git - 在 Jenkins 上进行 git 时检查特定文件夹

spring-boot - 如何在 Grails 4 中设置日志级别