与Grails开发数据库混淆

时间:2010-07-16 19:57:11

标签: grails datasource hsqldb

我正在用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是为开发测试而设置的,但我在这两个环境中遇到了一些麻烦(无论是使用此测试,还是使用非常简单的应用程序。)

2 个答案:

答案 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对同花顺的建议也很好。