我需要模拟一个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成为一个具有空方法声明的庞大具体类。任何替代方案?
答案 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
根据你的帖子,我不确定你是否正在寻找。