我正在尝试将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++ }
}
}
}
答案 0 :(得分:0)
确切的测试用例对我有用完美无缺。我有最新版本的fixture和构建测试数据插件,我正在使用Grails 2.2.2。
//Domain classes:
class User {
String username
Company company
}
class Company {
String name
}
构建测试数据永远不会让我感到困惑。我对问题的处理方法很少。 : - )
答案 1 :(得分:0)
您是否创建了TestDataConfig.groovy文件?您可以使用它来动态创建值以避免唯一约束。