1

在启动 TestNG 套件时尝试解决 OutOfMemoryError 时,我更改了我的 pom.xml 以使用当前可用的最新版本:TestNG 6.8.7(之前:6.8.1)

但是如果我现在尝试启动一个套件,org.testng.internal.Version.displayBanner() 仍然会打印相同的文本:

...
... TestNG 6.8.6beta_20130517_2142 by Cédric Beust (cedric@beust.com)
...

我对这段文字有两个问题:根据我的 pom,它应该是 6.8.7,而不是 6.8.6beta_... 根据 Eclipse 下载的源代码,它应该是“6.8.2beta_20130330_0839”。在我看来,在调试 org.testng.internal.Version.displayBanner 时,Eclipse 的行为很奇怪——我做了一个截图:Eclipse 在源代码中显示不同于输出中的文本

在我以外的其他工作站上,打印的文本不同,但不是预期的版本 6.8.7:“Cédric Beust 的 TestNG 6.8.6”也是。

我在类路径中找不到 TestNG 6.8.6beta_...。

我的问题是:为什么版本的字符串在源、打印/运行时不同,为什么两个版本都不等于 6.8.7?!

编辑:抱歉,在调试时未捕获屏幕截图。新的截图链接在上面,旧的可以在这里找到:不是在运行时:Eclipse 在源代码中显示与输出中不同的文本

4

2 回答 2

2

似乎还没有很好地理解将版本信息放入public static final字段中不是一个好主意。如果这样的字段具有原始类型或String像本示例中那样直接分配,则它是编译时常量,并且引用该字段的每个类都将在编译时复制其值。因此,如果编译时的版本与运行时的版本不同,则很可能出现不一致。

此外,eclipse 不一定显示一个类的正确源代码版本。根据库的类型,源文件与二进制类文件的关联方式不同,但 Eclipse 不会验证源文件和类文件是否兼容。

如果不确定当前执行的类是否是正确的版本,可以在调试器中验证类的来源。转到“表达式”视图并添加一个新条目org.testng.internal.Version.class.getProtectionDomain().getCodeSource().getLocation()。这很长,但幸运的是有复制和粘贴。这适用于不是来自 JRE 的所有类。另一种方法org.testng.internal.Version.class.getResource("Version.class")甚至适用于 JRE 类,但需要对结果进行一些解释。如果调试器中当前显示的类导入该类,您可以使用短类名。

嗯,你已经解决了这个问题,但我认为这些事情下次知道就好了……</p>

于 2013-10-18T16:41:01.723 回答
0

I found part of the problem by myself. I updated Eclipse's TestNG-plugin, now TestNG 6.8.6 is printed. Seems that the used version in pom.xml isn't relevant for execution with Eclipse - could have known that.

于 2013-10-23T13:44:07.820 回答