如何在grails testcase中使用executeQuery?
A error : groovy.lang.MissingMethodException: No signature of method ***.executeQuery() is applicable for argument types: () values: []
我已经调用了mockDomain。
顺便说一句,它是在单元测试中。
谢谢!
答案 0 :(得分:14)
在单元测试中尚不支持HQL查询,但我们正在努力。但你不应该用模拟进行持久性测试。应在集成测试中对数据库进行持久性测试。
我通常将HQL查询作为静态查询方法移动到域类。这样,它们很容易在控制器,服务等的单元测试中进行模拟,然后我将该方法作为域类集成测试的一部分进行测试。
例如我有
class User {
String username
String password
...
static List findAllUsersBlahBlah(String foo, boolean bar) {
executeQuery('from User u where ...')
}
}
然后在单元测试中,我可以用假数据模拟该方法,因为我不关心控制器单元测试中的持久性 - 我知道它在正确的位置进行了适当的测试,我想专注于测试中的类,而不是它的合作者:
def users = [new User(...), new User(...)]
User.metaClass.static.findAllUsersBlahBlah = { String foo, boolean bar -> users }
答案 1 :(得分:8)
我们已经在项目
中成功地使用Grails 2.0模拟了executeQuery@TestFor(BookController)
@TestMixin([DomainClassUnitTestMixin,ServiceUnitTestMixin])
@ConfineMetaClassChanges([Book])
class BookControllerSpec extends Specification{
mockDomain(Book)
Book.metaClass.static.executeQuery = {a,b,c-> return [Book]}
答案 2 :(得分:0)
在Grails 2.5.4中,您可以使用GroovyMock
来模拟在Java中实现的静态方法:
GroovyMock(Book, global: true)
我刚刚测试过 - 它也适用于_.executeQuery()