【问题标题】:Correct way to metaprogram in grails so its available in unit tests在 grails 中进行元编程的正确方法,使其在单元测试中可用
【发布时间】:2012-02-11 16:11:03
【问题描述】:

我可以在 Groovy 中为 java Integer 类型添加一个方法:

ExpandoMetaClass.EnableGlobally()
Integer.metaClass.gimmeAP = {->return 'p'}

我不知道我为什么需要它,但它明白了这一点。现在我可以调用 Integers 并返回一个“p”。现在假设我想在 grails 应用程序中使用它,这样我就可以在域对象中进行调用。我遇到的具体问题是,当我将这些元编程行放在引导程序中时,所有元编程在单元测试中都不可用,所以我的单元测试失败并出现诸如“No method gimmeAP for java.lang.Integer”之类的错误或类似的东西。

我如何更好地包含元编程,或者执行引导程序的那部分,以便我可以在单元测试中使用我被欺骗的语法?

我看到了这个问题:Grails - Making Methods Globally Available and Metaclass Programming,我的ExpandoMetaClass.EnableGlobally() 似乎可以解决他的问题,但我用对了吗?

【问题讨论】:

    标签: unit-testing grails metaprogramming


    【解决方案1】:

    Bootstrap 不会针对单元测试执行。我个人更喜欢创建一个执行上述元编程的 mockFoo 方法,然后我将从测试设置中调用 mockFoo。 另请查看 GrailsUnitTestCase.registerMetaClass。在添加模拟方法之前注册元类,这样它们就不会在其他测试中泄漏。

        registerMetaClass(SecurityUtils)
        SecurityUtils.metaClass.'static'.getSubject = { ->
            return [logout: { return true } ] as Subject
        }
    

    我知道你想让你的动态方法对所有单元测试都可用,但是没有什么比 bootstrap 更适合单元测试了。所以你必须在每次测试中都这样做。

    您可以使用静态方法创建 MockHelper,并从测试集调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多