【发布时间】:2023-03-13 04:30:01
【问题描述】:
这是测试场景:
Plugin A 有一个实用程序类 A.xyz(),它提供了一个抛出 java.util.NoSuchtElementException 的方法
Plugin B 提供“功能”。
Fragment F 使用B 作为主机并为B 提供测试。
现在,我的 JUnit 测试如下所示:
try {
A.xyz(paramTriggeringNoSuchMethodException);
fail('A.xyz did not throw NoSuchElementException');
} catch (NoSuchElementException e) {
// expected
}
所以,我希望 A.xyz() 抛出 NoSuchElementException 并明确捕获此异常,但测试仍然失败,告诉我有一个 NoSuchtElementException(我刚刚自己捕获)。
如果我捕捉到Throwable 而不是NoSuchElementException,则测试将通过。
鉴于所有插件/片段都在同一环境中运行,这怎么可能?
似乎A.xyz() 抛出了一个NoSuchElementException,它是使用不同的Classloader 作为测试本身加载的。
顺便说一句:当作为插件测试启动时,该测试在 Eclipse 中运行,但在使用 mvn install 从 maven 运行时失败
【问题讨论】:
-
所以你自己回答了这个问题。由不同的
ClassLoaders 加载的两个类始终是不同的类,无论它们的名称如何。但是,由不同的类加载器加载java.util.NoSuchElementException有点奇怪。 JRE 通常应该禁止这样做。 -
@Holger:这正是重点:这很奇怪,因为它是来自 JRE 的系统异常。
-
哇:测试开始时的以下断言失败:
assertNotNull("must not be null", NoSuchElementException.class.getClassLoader()); -
没关系。
nullClassLoader表示引导加载程序对于核心 Java 类是正确的。现在检查捕获的Throwable是什么(还要验证Throwable的实际类是什么;即使你确信它一定是NoSuchElementException,检查两次……) -
我认为原因是我不知道 maven 和 eclipse 具有不同的编译类状态。虽然 eclipse 总是使用最新的源代码,但我必须确保构建测试套件的父模块,然后再在 maven 中运行它。非常感谢,霍尔格。您的逻辑 POV 在这里有所帮助 :-)
标签: java eclipse maven junit osgi