我正在用Grails盯着玩具项目,但是我对HSQLDB数据库遇到了一些麻烦。我的DataSource.groovy文件是默认文件:
environments {
development {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop','update'
url = "jdbc:hsqldb:mem:devDB"
loggingSql = true
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:hsqldb:mem:testDb"
loggingSql = true
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:hsqldb:file:prodDb;shutdown=true"
}
}
}
我正在进行简单的测试:
class BookTests extends GrailsUnitTestCase {
protected void setUp() {
super.setUp()
mockDomain (Book)
def book = new Book ("The shinning","Some guy who wrote it")
if (book.save()){
println ("YEAH")
}
else{
print ("AWWWWHH")
}
}
protected void tearDown() {
super.tearDown()
}
void testSomething() {
def books = Book.getAll()
print (books.size())
}
}
在book.save()
方法中的setUp()
后,我得到了“YEAH”,但在testSomething()
方法中,books.size()
变为0。
在'test'包中找到1个测试类
YEAH 0流程已完成退出代码
0
我忽略了什么吗?我的印象是这个HSQLDB是为开发测试而设置的,但我在这两个环境中遇到了一些麻烦(无论是使用此测试,还是使用非常简单的应用程序。)
答案 0 :(得分:2)
使用book.save(flush: true)
因为调用save()
只会在将来的某个时刻将此对象注册为hibernate保存 - 例如在事务结束时。
在此处详细了解:http://grails.org/doc/latest/guide/single.html#5.3.1 Saving and Updating
编辑:我发现getAll()错误地实现了grails.test.MockUtils.groovy。没有正确处理无参数调用的实现。您可以通过简单的修复来解决这个问题。见附件:
package sandbox
import grails.test.*
class BookTests extends GrailsUnitTestCase {
protected void setUp() {
super.setUp()
// test data setup
def bookInstances = [
new Book(title: "Grails", author: "Graeme"),
new Book(title: "Spring", author: "Rod")
]
mockDomain Book, bookInstances
new Book(title: "The shinning", author: "Some guy who wrote it").save(flush: true)
// fixing parameterless getAll() behaviour through delegating to findAll()
registerMetaClass Book
Book.metaClass.'static'.getAll = {-> Book.findAll() }
}
protected void tearDown() {
super.tearDown()
}
void testSomething() {
assert Book.getAll().size() == 3
assert Book.findAll().size() == 3
}
}
答案 1 :(得分:1)
您正在使用单元测试。它不会向数据库保存任何内容。你正在嘲笑域名,所以Grails会做一些事情让你看起来有一些持久性方法可用,但没有任何东西进入数据库。如果您需要,请编写集成测试。
因此,在回答您的问题时,您的数据库没有问题。您无法开始进行单元测试。
@codescape对同花顺的建议也很好。