8

我在我的域中使用分配的 ID

class Book {

Integer id
String name

static mapping = {
    id generator: 'assigned'
    }   
}

所以要添加一本新书:

def book = new Book([name: "The Adventures of Huckleberry Finn"])
book.id = 123
book.save(flush: true)

一切正常,问题出在我的单元测试中

首先,我只能模拟 1 个域类,其次,我不能在单元测试中使用 .save(),所以我唯一的选择(据我所知)是使用 mockDomain 如下:

mockDomain(Book, [ [id: 123, name: "The Adventures of Huckleberry Finn"] ])

但它不起作用,它可以在没有“id generator:'assigned'”的普通域中工作

有任何想法吗?我读到我不会在集成测试中遇到这个问题,这只是单元测试中的问题谢谢

4

2 回答 2

10

如果要使用(默认情况下不是)它作为映射参数来在单元测试中创建域对象,则需要bindable约束。域类将具有ididbindable

static constraints = {
    id bindable: true
}

忠告:
如果您使用的是 Grails > 2.x,请使用@Mock模拟域类而不是mockDomain. 您可以在 Grails 文档中找到有关单元测试的详细信息。

另一个 Level Up
使用build-test-data插件来模拟域对象。

于 2013-05-14T00:06:19.033 回答
2

该解决方案符合我的需求:

Book mockBook = [name: "The Adventures of Huckleberry Finn"] as Book
mockBook.metaClass.id = 123
assert mockBook.id == 123
于 2014-04-25T18:16:20.220 回答