2010-10-30 67 views
10

有具有自定义静态函数从数据库中如何在Grails中模拟一个域对象的静态方法?

class Foo { 
    /* member variables, mapping, constraints, etc. */ 

    static findByCustomCriteria(someParameter, List listParameter) { 
     /* code to get stuff from the database... */ 

     /* 
      Return value is a map 
      ["one": "uno", "two": "due", "three": "tre"] 
     */ 
    } 

} 

静态函数findByCustomCriteria使用createCriteria()建立从符表中提取数据的查询,这意味着抓住数据的Grails域对象mockDomain(Foo)不起作用当单元测试正确时。我想要解决这个问题的方法是使用嘲笑的通用方法之一来剔除findByCustomCriteria,但我无法理解语法。

我有一个控制器BarController,我试图测试,并埋在呼叫BarController.someFunction()有一个电话Foo.findByCustomCriteria()

class BarControllerTest extends ControllerUnitTestCase { 

    protected void setUp() { 
     super.setUp() 
    } 

    protected void tearDown() { 
     super.tearDown() 
    } 

    void testSomeFunction() { 

     /* Mocking for Foo goes here */ 

     assertEquals("someValue", controller.someFunction()) 
    } 
} 

什么样的方法来嘲笑这件事?

我试过使用new MockFor()mockFor()metaClass,但我无法让它工作。


编辑:

每次我试图嘲弄了这一点,我试图嘲弄它是这样的...

Foo.metaClass.'static'.findByCustomCriteria = { someParam, anotherParam -> 
    ["one": "uno", "two": "due", "three": "tre"] 
} 

我想我起初并没有包括足够的信息。

+0

把嘲笑和foo的东西放在......这就是我们需要看到的帮助 – hvgotcodes 2010-10-30 00:13:58

回答

14

我遇到不止一次这种情况更多,你需要修改静态 metaClass上的Foo:

Foo.metaClass.'static'.findByCustomCriteria = { someParameter, List listParameter -> 
    ["one": "uno", "two": "due", "three": "tre"] 
} 

通常我会把它放在测试设置,所以我不会忘记何时需要应用。

+0

此解决方案不起作用。我正在更新相应的问题。 – haydenmuhl 2010-11-01 18:52:46

+0

@haydenmuhl:我更新了解决方案以包含一个明确的参数(我假定隐式参数是足够的,但也许不是,这可能是问题(即方法重载签名))。请再试一次。 – 2010-11-01 20:04:45

+0

您的解决方案可能会奏效,但我没有在我的问题中包含正确的信息。我使用的方法签名是错误的。它实际上采用了一个对象和一个列表,我嘲笑它为两个对象。我会更新这个问题。如果你更新你的答案,我会选择它是正确的。 – haydenmuhl 2010-11-01 20:56:40

4

在Grails的2.0及更高版本,可以使用GrailsMock类这样

def mockControl = new GrailsMock(MyDomainClass) 
mockControl.demand.static.get() {id -> return null} // Static method 
... 
mockControl.verify() 

here

相关问题