使用元类覆盖域中的gorm方法

时间:2013-09-20 19:34:04

标签: grails groovy

我有一个名为User的Domain类。 运行测试时,我想通过执行以下操作重新定义User类的get方法

  

User.metaClass.static.get = {Long id - > [username:“joe”,id:id]}

但是当我打电话给

时,应用上述内容似乎没有影响
  

User.get(2)

我可以在静态域GORM方法(如get()或list())中使用metaClass来改变它们的行为吗? 感谢

这是我的testCase:

  

@Test

     

void testMe(){

  User.metaClass.static.get = { id -> [username:"joe", id:id]}

  def user  = User.get(3)

  assert user.username == "joe"
     

}

我得到一个NPE无法在null对象上获取属性'username'

我实际上可以使用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"
  } 

2 个答案:

答案 0 :(得分:0)

不要输入closure参数。如果您在编写时使用该方法,则需要调用User.get(2L),否则您将传递整数并且签名不匹配。如果您将get定义为

,它应该有效
User.metaClass.static.get = { id -> [username:"joe", id:id]}

答案 1 :(得分:0)

尝试将以下注释添加到测试中

@Mock([User])

然后你可以这样做:

def userControl = mockFor(User)
userControl.demand.static.get() {Long id -> return null}