精通 Grails: 使用 Grails 进行单元测试(单元测试提速)
2009-11-26 00:00:00 来源:WEB开发网mockDomain() 方法尽可能忠实地建模 GORM 行为。例如,当您将一个域类保存到模拟表在中时,会像在实际应用程序中一样填充 id 字段。id 值只是列表中元素的序数值。清单 13 展示了在单元测试中保存 域类:
清单 13. 将一个域类保存到单元测试中void testMockGorm(){
def jdoe = new User(name:"John Doe", role:"user")
def suziq = new User(name:"Suzi Q", role:"admin")
def jsmith = new User(name:"Jane Smith", role:"user")
mockDomain(User, [jdoe, suziq, jsmith])
def foo = new User(login:"foo")
foo.name = "Bubba"
foo.role = "user"
foo.password = "password"
foo.save()
assertEquals 4, foo.id //NOTE: id gets assigned
assertEquals 3, User.findAllByRole("user").size()
}
模拟底层数据库并不是您唯一可以在 GrailsUnitTestCase 中完成的工作。您也可以模拟日志基础架构。
理解 mockLogging()
的用途并不仅仅是测试域类。键入 grails create-service Admin 创建一个 Admin 服务,如清单 14 所示:
GrailsUnitTestCase
模拟和元编程的局限性
mockDomain() 方法只是简单地利用底层 Groovy 语言的本机动态功能。(要了解 Groovy 中的元编程的更多信息,请查阅 “实战 Groovy:使用闭包、ExpandoMetaClass 和类别进行元编程。”)实际上,它会拦截通常存在于域类上的方法调用,并将它们替换为模拟行为,以进行测试。毫无疑问,这意味着不会模拟其他支持技术,比如条件块、 Hibernate Query Language (HQL) 和 Query By Example (QBE)。如果您的代码依赖于这些技术中的任何一种,您需要编写集成测试并运行一个实际的数据库。
更多精彩
赞助商链接