【问题标题】:Is it possible for e JUnit test to tell if it's running in Eclipse (rather than ant)e JUnit 测试是否可以判断它是否在 Eclipse(而不是 ant)中运行
【发布时间】:2011-05-21 12:12:58
【问题描述】:

我有一个测试,将大量预期的 XML 与收到的实际 XML 进行比较。如果 XML 明显不同,则将实际 XML 写入磁盘进行分析,测试失败。

我更喜欢使用 assertEquals,以便在 Eclipse 中更轻松地比较 XML - 但这可能会导致 JUnit 和 CruiseControl 日志非常大。

有没有一种方法可以改变 JUnit 测试行为,具体取决于它是通过 Eclipse 运行还是通过 Ant 运行。

【问题讨论】:

  • 我不明白为什么 assertEquals 可以更容易地在 Eclipse 中进行比较?当然任何差异工具都可以吗?

标签: java xml eclipse ant junit


【解决方案1】:

这里有 2 个解决方案。

使用系统属性

boolean isEclipse() {
    return System.getProperty("java.class.path").contains("eclipse");
}

使用堆栈跟踪

boolean isEclipse() {
    Throwable t = new Throwable();
    StackTraceElement[] trace = t.getStackTrace();
    return trace[trace.length - 1].getClassName().startsWith("org.eclipse");
}

【讨论】:

  • @AlexR Brilliant,从未想过实例化异常来确定我当前调用的上下文。这是滥用的时机,但似乎在某些情况下它是完美的。谢谢你。
【解决方案2】:

是的 - 您可以测试是否设置了某些 osgi 属性(例如System.getProperty("osgi.instance.area"))。如果junit是通过eclipse的outside启动的,它们将为空。

【讨论】:

  • Eclipse Juno 内部也是空的。 :(
【解决方案3】:

如果在路径中包含一些 Eclipse jar,"java.class.path" 方法可能会很弱。

另一种方法是测试"sun.java.command"

在我的机器上(openjdk-8):

sun.java.command    org.eclipse.jdt.internal.junit.runner.RemoteTestRunner ...

一个可能的测试:

boolean isEclipse() {
    return System.getProperty("sun.java.command")
      .startsWith("org.eclipse.jdt.internal.junit.runner.RemoteTestRunner");
}

【讨论】:

    【解决方案4】:

    通常,系统属性在不同的环境中是不同的。尝试查找仅由 eclipse 或 ant 设置的系统属性。

    顺便说一句:eclipse中的输出是一样的,只是eclipse的控制台以更易读的形式呈现输出。

    就我个人而言,我不会担心日志的大小。一般来说,您不需要将它们保存很长时间,而且磁盘空间很便宜。

    【讨论】:

    • 这将是一个有趣的问题评论,但它绝对不是一个有用的答案。
    【解决方案5】:

    在 Java 1.6+ 中,System.console() 的结果似乎在为 Eclipse 运行还是从终端运行时有所不同:

    boolean isRealTerminal()
    {
        // Java 1.6+
        return System.console() != null;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 2011-06-18
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多