unit-testing - 在 grails 中元编程的正确方法,以便在单元测试中可用

标签 unit-testing grails metaprogramming

我可以使用以下行向 Groovy 中的 java Integer 类型添加一个方法:

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

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

我如何更好地包含元编程,或者执行 bootstrap 的那部分,以便我可以在单元测试中使用我精心设计的语法?

我见过这个问题:Grails - Making Methods Globally Available and Metaclass Programming看来我的线路 ExpandoMetaClass.EnableGlobally()可能会解决他的问题,但我用对了吗?

最佳答案

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

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

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

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

关于unit-testing - 在 grails 中元编程的正确方法,以便在单元测试中可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8884756/

相关文章:

c++ - 具有模板类型的模板化模板参数列表

c++ - 获取所有基类 [元编程]

python - 分布式/更快的 python 单元测试

c++ - 如何设置要运行的 Boost 单元测试

grails - 如何将 Grails 添加到我的 cloudbees Jenkins 安装中?

performance - grails 2/groovy 2/JDK7 : how to reap the benefits?

ajax - Grails选择RemoteFunction不起作用?

Grails - 在任何 Controller 中都可用的写入方法

python - 在 Python 中编写 Selenium 单元测试的正确方法?

javascript - 如何在 Jest/Enzyme 上测试子组件