5

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

A error : groovy.lang.MissingMethodException: No signature of method ***.executeQuery() is applicable for argument types: () values: []

我已经调用了 mockDomain。

顺便说一句,它在单元测试中。

谢谢!

4

3 回答 3

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 }
于 2012-02-17T15:15:44.680 回答
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]}
于 2012-02-17T20:04:24.627 回答
0

在 Grails 2.5.4 中,您可以GroovyMock用于模拟 Java 中实现的静态方法:

 GroovyMock(Book, global: true)

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

于 2016-12-23T14:06:34.750 回答