作为Grails项目的一部分,我目前正在将测试套件扩展到需要运行完整环境的内容,例如自定义HQL和条件查询,与 session 相关的问题等。我正在使用集成测试。
我们已经有相当多的单元测试(> 500),在这里我们曾经使用这样的辅助函数来模拟默认情况下没有Grails模拟对象的方法(例如withCriteria
,withNewSession
等):
static mockCriteria(Class clazz, returnValue)
{
def myCriteria = new Expando()
myCriteria.list = {Closure cls -> returnValue}
myCriteria.get = {Closure cls -> returnValue}
clazz.metaClass.static.createCriteria = { -> myCriteria }
}
然后可以像下面这样测试代码:
mockCriteria(MyClass, [result])
assert myClass.createCriteria.list({ ... }) == [result]
到目前为止,我一直使用这种方法设法满足我的需求。
现在,我想添加集成测试,这些测试实际检查使用条件和HQL查询的方法的行为,以便于重构这些查询。我对
createCriteria
在我的测试中被替换并且在单元测试阶段之后不恢复其初始代码的事实深感困惑,这阻止了我在集成阶段对其进行测试。您如何解决模拟标准(或HQL查询等)的问题,同时又允许在集成测试中恢复原始行为?
编辑:不幸的是,升级到Grails 2不是一个选择。
最佳答案
我不是 mock 标准,而是 mock 使用它们的 Realm 方法。
另外,Grails 2.0 promise 在单元测试中提供标准支持-但不是HQL。
关于unit-testing - 扩展Grails模拟以进行单元测试(createCriteria,withNewSession等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8312178/