Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在grails测试用例中使用executeQuery?_Grails_Testcase - Fatal编程技术网

如何在grails测试用例中使用executeQuery?

如何在grails测试用例中使用executeQuery?,grails,testcase,Grails,Testcase,如何在grails测试用例中使用executeQuery A error : groovy.lang.MissingMethodException: No signature of method ***.executeQuery() is applicable for argument types: () values: [] 我已经给mockDomain打过电话了 顺便说一下,这是单元测试 谢谢 单元测试中还不支持HQL查询,但我们正在努力。但是你不应该用mock做持久性测试。应在集成测试中

如何在grails测试用例中使用executeQuery

A error : groovy.lang.MissingMethodException: No signature of method ***.executeQuery() is applicable for argument types: () values: []
我已经给mockDomain打过电话了

顺便说一下,这是单元测试


谢谢

单元测试中还不支持HQL查询,但我们正在努力。但是你不应该用mock做持久性测试。应在集成测试中对数据库进行持久性测试

我通常将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 }

在我们的项目中,我们已经成功地使用Grails2.0模拟了executeQuery

@TestFor(BookController)
@TestMixin([DomainClassUnitTestMixin,ServiceUnitTestMixin])
@ConfineMetaClassChanges([Book])
class BookControllerSpec extends Specification{
   mockDomain(Book)
   Book.metaClass.static.executeQuery = {a,b,c-> return [Book]}

在Grails2.5.4中,可以使用
GroovyMock
模拟Java中实现的静态方法:

 GroovyMock(Book, global: true)

我刚刚测试过-它也适用于
。.executeQuery()

能否请您提供一个实现此功能的示例单元测试。我先尝试了其他解决方案,但最终不得不使用此解决方案,如果您在使用后不进行清理,thanksmetaclassing可能会导致进一步的问题。你被警告了。