如何在Grails中使用静态成员模拟抽象类?

时间:2009-11-06 17:04:24

标签: unit-testing grails groovy mocking

我需要模拟一个GrailsControllerClass接口。实例应该定义一个静态变量。问题是MockFor和StubFor没有为您提供添加静态成员的选项。 所以,我编写了扩展GrailsControllerClass

的抽象类
abstract class MyController implements GrailsControllerClass {
   static myDefinition  = [name:"item1", action:"action1"]
}

现在,MockFor和StubFor引发错误:groovy.lang.MissingMethodException:没有方法签名:groovy.util.ProxyGenerator.instantiateAggregateFromBaseClass()适用于参数类型:(java.lang.Class,null)values ...似乎是一个报告的错误: http://jira.codehaus.org/browse/GROOVY-3720 唉,Grails带有groovy 1.6。

我不想让MyController成为一个具有空方法声明的庞大具体类。任何替代方案?

3 个答案:

答案 0 :(得分:1)

尝试

class Tests extends GrailsUnitTestCase {

SUT systemUnderTest = new SUT()

testMocksStaticMethod(){

ClaasToBeMocked mockedClass = new ClassToBeMocked()

mockedClass.staticMethod = [staticMethod: {return "TestValue"}] as ClassToBeMocked

assertEquals("something", systemUnderTest.methodThatCallsStaticMethod())
}

答案 1 :(得分:0)

你试过GMock了吗?它支持模拟静态方法。

答案 2 :(得分:0)

你可以调整我认为的metaClass:

GrailsControllerClass.metaClass.'static'.myDefinition = [name:"item1", action:"action1"]

或使用地图模拟您的控制器界面:

def myController = [getMyDefinition:{[name:"item1", action:"action1"]}] as GrailsControllerClass

根据你的帖子,我不确定你是否正在寻找。