【发布时间】:2013-09-26 07:11:51
【问题描述】:
我有一个名为 User 的域类。 运行测试时,我想通过执行以下操作重新定义 User 类的 get 方法
User.metaClass.static.get = {Long id -> [username:"joe", id:id]}
但是当我调用时应用上述似乎没有影响
用户.get(2)
我可以在静态域 GORM 方法(如 get() 或 list() )中使用 metaClass 来改变它们的行为吗? 谢谢
这是我的测试用例:
@测试
void testMe(){
User.metaClass.static.get = { id -> [username:"joe", id:id]} def user = User.get(3) assert user.username == "joe"}
我得到一个 NPE 无法在空对象上获取属性“用户名”
我实际上可以使用 groovy MockFor 来做到这一点
def mockControl = new MockFor(User.class) mockControl.demand.get {id -> return [username:"joe"]} mockControl.use { def user = User.get(3) assert user.username == "joe" }
【问题讨论】:
-
有什么理由不使用可用的模拟 api?
-
@dmahapatro 你指的是什么模拟 api?
-
@Mock用于域类。您是否专门尝试测试User.get是否按预期工作? -
这是在集成测试中。我实际上尝试放置 Mock 注释,但我会得到“Annotation @grails.test.mixin.Mock is not allowed on element METHOD”
-
我假设真正的测试有点复杂。如果你绕过 GORM 数据库集成......你在测试什么?集成测试不允许 Mock,因为您应该在这些测试期间向数据库添加内容。