【问题标题】:Google AppEngine + Local JUnit Tests + Jersey framework + Embedded JettyGoogle AppEngine + 本地 JUnit 测试 + Jersey 框架 + Embedded Jetty
【发布时间】:2010-02-28 14:19:04
【问题描述】:

我使用 Google Appengine for Java (GAE/J)。 最重要的是,我使用 Jersey REST 框架。

现在我想运行本地 JUnit 测试。测试

不幸的是,Jersey/Jetty 组合产生了新线程。 GAE 期望只有一个线程运行。 最后,我最终要么在 Jersey-resources 中没有 datstore,要么拥有多个不同的数据存储区。

作为一种解决方法,我只初始化 GAE 本地环境一次,将它放在一个静态变量中,并在 GAE 资源中添加许多检查(这个线程没有开发环境?重用静态的)。 这些检查当然应该只在 JUnit 测试中运行。(我之前问过:“我怎样才能知道代码是否在 JUnit 测试中运行?” - 我不允许直接在这里发布链接:-|)

【问题讨论】:

    标签: java google-app-engine junit jersey embedded-jetty


    【解决方案1】:

    也许使用系统属性... 当它是一个 Junit 运行时,通过一个 JVM arg 设置一个 Java 系统属性,然后你可以测试这样的东西:

    • 在测试时(可能在 IDE 等中)通过运行配置参数传递 JVM 参数,如下所示:-DRunningTestsOnly=true
    • 在代码中:if ("true".equals(System.getProperty("RunningTestsOnly")))

    我之前在 JUnit 测试中做过类似的事情,使用假设忽略测试,我认为在我动力不足的开发 PC 上运行需要很长时间......

    • 传入 JVM 参数:-DexecuteQuickRunningTestsOnly=true
    • 如果我将属性集放在方法的顶部,则忽略运行缓慢的测试方法:assumeThat(System.getProperty("executeQuickRunningTestsOnly", "false"), is("false"));

    【讨论】:

    • 还可以考虑使用环境变量,例如通过String runLevel = System.getenv("RUN_LEVEL"); 在代码中访问。 语言无关机制很受欢迎,它允许您的程序在不同环境(开发、测试、集成、CI、生产等)中具有不同的配置参数
    • 另外,如果你使用 Gradle,它会在测试时自动设置属性org.gradle.test.workersee the documentation
    • 万一其他人碰到它,我没有深入挖掘,但是org.gradle.test.worker属性在直接从gradle运行时似乎存在,但在IDEA中运行时却不见了。
    【解决方案2】:

    只是一个想法: 您可以创建一个异常,然后遍历异常的堆栈跟踪以查看其中是否有来自 junit 包的类。

    【讨论】:

      猜你喜欢
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多