如何在 Groovy 中重置模拟静态方法?

2024-03-07

我在测试设置中有以下内容:

    def originalPostAsXml = RestClient.&postAsXml

    RestClient.metaClass.'static'.postAsXml = {
        String uriPath, String xml ->
        return 65536
    }

并在测试清理中:

    RestClient.metaClass.'static'.postAsXml = originalPostAsXml

但是当下一个测试运行时,当它尝试执行 RestClient.postAsXml 时,它会遇到 StackOverflowError:

at groovy.lang.Closure.call(Closure.java:282)

看起来 RestClient.postAsXml 递归地指向自身。重置模拟静态方法的正确方法是什么?


在单元测试中,我经常将元类设置为null in the tearDown()这似乎允许类在没有我修改的情况下像原来一样工作。

example:

void setUp() {
    super.setUp()
    ServerInstanceSettings.metaClass.'static'.list = {
        def settings = [someSetting:'myOverride'] as ServerInstanceSettings
        return [settings]
    }
}

void tearDown() {
    super.tearDown()
    ServerInstanceSettings.metaClass.'static'.list = null
}

如果您使用的是 JUnit4,您可以使用@AfterClass相反,在这种情况下,这也许更有意义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Groovy 中重置模拟静态方法? 的相关文章

  • 抑制 Jenkins 文件中的管道输出

    当我在詹金斯上运行构建时 它总是在执行詹金斯步骤时打印管道 控制台当前输出 Build context CI clean app clean BUILD SUCCESSFUL in 22s 2 actionable tasks 2 exec
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • 在 groovy 脚本中执行外部程序并捕获输出

    我需要编写一个常规脚本 即执行外部程序并将该程序的输出打印到控制台 这是相关的代码片段 def pmdCommand scriptDir run sh pmd d filesToAnalyse def sout new StringBuff
  • spock 测试的 where 子句中的多个赋值?

    我正在使用 Spock 框架进行测试 并且有一个关于 where 子句中的多变量赋值的问题 我有以下测试用例 def sending a message delegates to message sender when sendMessag
  • 如何加入groovy中的地图列表

    如果我有两个 groovy 地图列表 def x a 1 b 2 a 1 b 3 a 2 b 4 def y f 10 b 2 g 7 f 100 b 3 g 8 f 20 b 4 g 9 我如何根据特定属性加入它们 在上面的示例中 值b
  • 如何为新任务类型扩展 Gradle 任务的行为?

    我想为一些测试任务设置一些东西 更具体地说 我想添加一些环境变量和一些系统属性 也许还有一些其他内容 例如 依赖项 或 workingDir 与常规的Test任务我可以做到这一点 task test1 type Test dependsOn
  • 如何使用 Groovy 获取没有继承方法的类的所有方法名称?

    Question 如果没有继承的方法 如何获取类的所有方法的名称 Example def methods MyClass methods collect it name println methods each println it ass
  • 未找到 Gradle DSL 方法:“exclude()”

    我正在 Android Studio 中工作 当我在 build gradle 文件中添加该行时 dependencies compile files libs poi ooxml schemas 3 12 20150511 a jar e
  • Groovy:为什么我需要双转义方括号?

    为什么这不起作用 hello world split 这会 hello world split 这实际上是不同上下文中的两次转义 因为参数是表示为字符串的正则表达式 The 必须进行转义 否则它将在正则表达式中具有特殊含义 正则表达式的转义
  • 更改 Grails 的 Groovy 版本

    如何将 Grails 1 3 7 使用的 groovy 版本更改为 groovy 1 7 9 我在 Grails 1 3 7 应用程序中遇到这个问题 其中 Quartz 进程每分钟都会实例化大约 500 个新对象 如下所示 class Fo
  • 开始使用 Groovy/Grails? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对Java有了一些了解 我想学习Groovy grails 因此 请向我推荐任何好的网站和博客 我可以在其中找到文档以及 Groovy
  • 使用转置以完全外连接样式合并列表

    我正在尝试返回一个加入列表 但连接必须像数据库完全外连接一样 例如 给出以下内容 def x a 1 b 2 a 1 b 3 a 2 b 4 a 3 b 5 def y f 10 b 2 g 7 f 100 b 3 g 8 f 20 b 4
  • Grails 测试中的模拟配置

    在 Grails 2 0 X 之前 可以使用mockConfig测试扩展的基类提供的方法 然而 在 Grails 2 0 X 中 建议测试类使用 TestFormixin 而不是扩展基类 这个 mixin 似乎没有提供任何与mockConf
  • 在 Groovy 中将两个映射合并为结果映射

    我有两张地图 firstMap totalProjectCount 53 activeProjectCount 29 completedProjectCount 1 userCount 85 secondMap totalProjectCo
  • 在 mule 中使用 groovy 表达式来限制 IP

    我在 mule 中使用 cxf 创建了一个代理服务 我的 mule 版本是 3 3 0 CE 现在 我想在使用代理服务创建的 wsdl 中添加限制 我的限制不应允许他们看到我的 wsdl 的每个 IP 为此 我找到了 Groovy 表达式和
  • 在 Grails 域对象中维护自引用多对多关系的双方

    我在让多对多关系在 grails 中工作时遇到一些问题 以下内容是否有明显错误 class Person static hasMany friends Person static mappedBy friends friends Strin
  • 如何从詹金斯管道获取所有参数(参数化构建)?

    我正在较新版本的 jenkins 中构建一个参数化管道作业 在较旧版本的 jenkins 中 我使用 getbinding getVariables 来检索所有参数 但较新的版本它返回空值 如何在新版本的詹金斯中检索参数 全部 您可以使用
  • 访问静态范围内的全局变量

    有没有办法从同一脚本中声明的类的静态方法访问脚本中声明的全局变量 例如 def s 12345 class MyClass static def method println s 因为这样它会因错误而失败 You attempted to
  • 无法在 Intellij 上创建 Groove 脚本 - @NotNull 参数的参数

    我正在尝试开始学习 Groovy 以便在 JIRA 上使用 ScriptRunner 执行 API 调用 所以我从基础开始 我的问题是我什至无法使用 Intellij 创建 Groovy 脚本 在项目创建时它选择Groovy并选择项目SDK
  • 如何在启动时向 groovysh 添加导入?

    我正在开发一个项目 希望用户在 Groovysh 上试验 Java 类 我想让他们方便 并希望在 groovysh 启动时默认导入某些包 这样用户就不必在每次启动 shell 时重新输入相同的导入 有谁知道如何做到这一点 提前致谢 伊戈尔

随机推荐