【问题标题】:How to mock abstract class with static members in Grails?如何在 Grails 中使用静态成员模拟抽象类?
【发布时间】:2009-11-06 17:04:23
【问题描述】:

我需要模拟一个 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) 值...似乎是一个报告的错误: https://issues.apache.org/jira/browse/GROOVY-3720 唉,grails 带有 groovy 1.6。

我不想让 MyController 成为一个带有空方法声明的巨大的具体类。有其他选择吗?

【问题讨论】:

    标签: unit-testing grails groovy mocking


    【解决方案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())
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我希望我的测试能够扩展 GrailsTestCase,以便我可以使用 grails 测试运行器。虽然您似乎可以使用 @WithGMock 注释,但您的断言似乎必须包含在 play{} 中。在我看来,gmock 不仅仅是嘲笑 fwk..
      • 是的,GMock 比标准的 Groovy MockFor 或 StubFor 更复杂,但它仍然是一个模拟框架,仅此而已。测试的执行部分必须在 play 闭包中,它将期望的设置和行为的添加与执行分开。这有点类似于 EasyMock 的做法,但感觉更自然。是的,你是对的,如果你想扩展 GrailsUnitTestCase 而不是 GMockTestCase,那么你必须使用 @WithGMock 注解。
      【解决方案3】:

      我相信你可以调整元类:

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

      或者使用地图来模拟你的控制器界面:

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 2019-07-04
      • 2010-09-18
      • 2012-11-23
      • 2011-05-02
      相关资源
      最近更新 更多