Grails Fixtures + Build-Test-Data尝试为对象创建重复的ID

时间:2013-06-04 22:22:34

标签: hibernate grails fixtures

我正在尝试将fixtures和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]

这让我相信构建测试数据正试图将id0与两家公司联系起来。臭死了。谁能告诉我为什么?

- 编辑 -

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

osborp为此提供了解决方案。使用以下命令构建TestDataConfig:

testDataConfig {

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

}

2 个答案:

答案 0 :(得分:0)

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

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

class Company {
    String name
}

构建测试数据永远不会让我感到困惑。我对问题的处理方法很少。 : - )

答案 1 :(得分:0)

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