1

开始玩 grails 并且我想评估 GORM,所以我使用 Spring Tool Suite 创建了一个域类:Clientwith name, vatNumber, andregNumber并且自动创建了测试类。

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

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

4 回答 4

2

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

save() 将提供一个 id。

您可能需要保存(刷新:真)。

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

然后做你的测试。

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

于 2011-06-13T20:44:13.307 回答
1

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

“正如我之前提到的,Grails 支持两种基本类型的测试:单元测试和集成测试。两者在语法上没有区别——两者都使用相同的断言编写为 GroovyTestCase。区别在于语义。单元测试旨在测试单独的类,而集成测试允许您在完整的运行环境中测试该类。坦率地说,如果您想将所有 Grails 测试编写为集成测试,那对我来说很好。所有 Grails 创建-* 命令生成相应的集成测试,所以大多数人只是使用已经存在的东西。正如您稍后将看到的,您想要测试的大多数东西都需要完整的环境才能启动并运行,所以集成测试是一个很好的默认值。”

于 2011-06-13T20:07:57.170 回答
1

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

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

于 2011-06-13T20:31:51.563 回答
1

保存客户端可能会失败而不会引发异常,这可以解释为什么 res 为空。试试下面的代码,这样你就可以看到保存客户端是否失败以及为什么失败。

client.save()
if(client.hasErrors()){
// Saving failed, look in client.errors to see the specific reason
}
于 2011-06-14T06:37:42.303 回答