【问题标题】:Grails Fixtures + Build-Test-Data tries to create duplicate IDs for objectsGrails Fixtures + Build-Test-Data 尝试为对象创建重复的 ID
【发布时间】:2013-06-04 22:22:34
【问题描述】:

我正在尝试将夹具和 build-test-data 合并到我们的 grails 测试中,但即使是最简单的示例,当我尝试使用 build-test-data 插件构建两个相同的类时也会遇到 id 冲突.我不禁觉得我错过了一些非常简单的东西。

这很好用。假设需要导入的所有内容都已导入。

class TemporaryFixturesTests extends GroovyTestCase {

/* injected */
def fixtureLoader

void testFixtureLoadsProperly() {

    def fixture = fixtureLoader.load {
        build {
            testCompany(Company, name: "TestCompany")
            testBasicUser(User, username: "TestUserBasic", company: testCompany)
        }
    }

    assert fixture.testBasicUser.company.name == "TestCompany"
}

void setUp() {
    //TODO
}
}

这个……

class TemporaryFixturesTests extends GroovyTestCase {

/* injected */
def fixtureLoader

void testFixtureLoadsProperly() {

    def fixture = fixtureLoader.load {
        build {
            testCompany(Company, name: "TestCompany")
            testCompany2(Company, name: "TestCompany2")
            testBasicUser(User, username: "TestUserBasic", company: testCompany)
            testBasicUser2(User, username: "TestUserBasic2", company: testCompany2)
        }
    }

    assert fixture.testBasicUser.company.name == "TestCompany"
    assert fixture.testBasicUser2.company.name == "TestCompany2"
}

void setUp() {
    //TODO
}
}

因错误而中断...

nested exception is org.hibernate.NonUniqueObjectException: a different object with the   same identifier value was already associated with the session: [<path removed>.Company#0]

这让我相信 build-test-data 试图将 id0 与两家公司相关联。臭死了。谁能告诉我为什么?

--编辑--

似乎有问题的表没有设置为具有自动递增的 ID。因此,当构建测试数据试图让我成为一个 id 列时,它每次都会生成 0,因为这是一个自动生成的整数。

osborp 为此提供了解决方案。构建一个 TestDataConfig :

testDataConfig {

sampleData {
    '<path removed>.Company' {
        def i = 0
        id = {-> i++ }
    }
    '<path removed>.User' {
        def i = 0
        id = {-> i++ }
    }
}

}

【问题讨论】:

    标签: hibernate grails fixtures


    【解决方案1】:

    确切的测试用例对我来说完美无缺。我有最新版本的夹具和构建测试数据插件,并且正在使用 Grails 2.2.2。

    //Domain classes:
    class User {
        String username
        Company company
    }
    
    class Company {
        String name
    }
    

    构建测试数据对我来说从来都不是坏事。我处理问题的方法很少这样做。 :-)

    【讨论】:

      【解决方案2】:

      您是否创建了TestDataConfig.groovy 文件?您可以使用它来动态创建值以避免唯一约束。

      【讨论】:

      • 我没有。这可能是我正在寻找的。但是 build-test-data 不应该自己工作自动递增 id 吗?
      • 是的。就是这样!我刚刚将'def i = 0 id = {-> i++ }'添加到该文件和bam。固定的。谢谢!
      • ID 应该自动递增(我以前在使用 Fixtures/BuildTestData 时不需要做任何额外的事情)。您的测试用例也适用于我。也许您的数据库配置有所不同。 (关于我使用的信息:使用内存数据库的 Grails 2.2.2、Fixtures 1.2 和 BuildTestData 2.0.5)
      猜你喜欢
      • 1970-01-01
      • 2013-04-12
      • 2016-01-29
      • 1970-01-01
      • 2016-06-22
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      相关资源
      最近更新 更多