域类(gorm)的Grails单元测试

时间:2011-06-13 19:19:08

标签: hibernate unit-testing grails gorm grails-domain-class

开始使用grails并且我想评估GORM,因此我使用Spring Tool Suite创建了一个域类:Client namevatNumberregNumber以及测试类是自动创建的。

我添加的单元测试代码是:

package pilot1

import grails.test.*

class ClientTests extends GrailsUnitTestCase {
    protected void setUp() {
        super.setUp()
    }

    protected void tearDown() {
        super.tearDown()
    }

    void testSomething() {
        def instances = []
        def myTestDomain = mockDomain(Client, instances)
        def client = new Client(name:"Test",vatNumber:"323",regNumber:"343")
        client.id =1;
        assertEquals client.name, "Test"
        client.save();
        def res = Client.findByName("Test")
        println instances
        println res
        //assertEquals 1, instances.size()
    }
}

结果是[]和null!我做错了什么?

另外,我还希望看到GORM(Hibernate)在幕后生成的SQL。知道如何在Grails中做到这一点吗?

4 个答案:

答案 0 :(得分:2)

不要这样做:client.id = 1;

save()将提供一个id。

你可能需要保存(flush:true)。

只需执行保存并使用然后使用id进行获取。

然后进行测试。

此链接可能有用:http://blog.springsource.com/2011/06/07/countdown-to-grails-1-4-unit-testing/

答案 1 :(得分:1)

http://www.ibm.com/developerworks/java/library/j-grails10148/index.html

“正如我前面提到的,Grails支持两种基本类型的测试:单元和集成。两者之间没有语法差异 - 两者都是使用相同的断言写成GroovyTestCase。区别在于语义。单元测试是意味着单独测试类,而集成测试允许您在完整的运行环境中测试类。 坦率地说,如果你想把你所有的Grails测试都写成集成测试,那对我来说就没问题了。所有Grails create- *命令都会生成相应的集成测试,因此大多数人只使用已经存在的内容。正如您稍后将看到的那样,您想要测试的大部分内容都需要完整的环境才能正常运行,因此集成测试是一个非常好的默认设置。“

答案 2 :(得分:1)

首先,您不应该评估GORM本身。那些提供Grails的人负责测试GORM。当然,你可能并不是那个意思。

其次,测试findBy *()通常不是单元测试的关注点。如果确实需要测试findBy *(),则需要收集所有findBy *()响应实例,并将该列表作为第二个参数传递给mockDomain()。您在示例中错误地使用了mockDomain() - 您必须告诉mockDomain()哪些实例要进行模拟,以便在findBy *()调用中接收它们。

答案 3 :(得分:1)

保存客户端可能会失败而不会抛出异常,这可以解释为什么res为null。请尝试下面的代码,以便了解保存客户端是否以及失败的原因。

client.save()
if(client.hasErrors()){
// Saving failed, look in client.errors to see the specific reason
}