开始使用grails并且我想评估GORM,因此我使用Spring Tool Suite创建了一个域类:Client
name
,vatNumber
和regNumber
以及测试类是自动创建的。
我添加的单元测试代码是:
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中做到这一点吗?
答案 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
}