Java eJUnit测试是否可以判断它是否';s在Eclipse中运行(而不是ant)

Java eJUnit测试是否可以判断它是否';s在Eclipse中运行(而不是ant),java,xml,eclipse,ant,junit,Java,Xml,Eclipse,Ant,Junit,我做了一个测试,将一大块预期的XML与实际收到的XML进行比较。如果XML明显不同,则实际的XML将写入磁盘进行分析,测试将失败 我更喜欢使用assertEquals,以便在Eclipse中更容易地比较XML——但这可能会导致非常大的JUnit和CruiseControl日志 有没有一种方法可以根据JUnit测试是通过Eclipse还是通过Ant运行来改变它的行为。通常,在不同的环境中,系统性能是不同的。尝试查找仅由eclipse或ant设置的系统属性 顺便说一句:eclipse中的输出是相同的

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

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


有没有一种方法可以根据JUnit测试是通过Eclipse还是通过Ant运行来改变它的行为。

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

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

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

这里有两种解决方案

使用系统属性

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

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

是-您可以测试是否设置了某些osgi属性(
System.getProperty(“osgi.instance.area”)
)。如果junit是在eclipse之外通过ant启动的,那么它们将是空的。

对于Java 1.6+,它看起来像是
System.console()的结果。
决定了在eclipse中运行还是从终端运行:

boolean isRealTerminal()
{
    // Java 1.6+
    return System.console() != null;
}
如果在路径中包含一些EclipseJAR,那么
“java.class.path”
方法可能会很弱

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

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

一个可能的测试:

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

我不明白为什么assertEquals使Eclipse中的比较更容易?任何diff工具都可以吗?@AlexR Brilliant从未想过实例化一个异常来确定我当前调用的上下文。这是滥用的时机,但似乎有可能是完美的。谢谢。这将是一个关于这个问题的有趣的评论,但它绝对不是一个有用的答案。它在Eclipse朱诺内部也是空的(
boolean isEclipse() {
    return System.getProperty("sun.java.command")
      .startsWith("org.eclipse.jdt.internal.junit.runner.RemoteTestRunner");
}