【问题标题】:Classloader issues: Exception not caught even if explicitly caught in test类加载器问题:即使在测试中明确捕获,也没有捕获异常
【发布时间】: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());
  • 没关系。 null ClassLoader 表示引导加载程序对于核心 Java 类是正确的。现在检查捕获的Throwable 是什么(还要验证Throwable 的实际类是什么;即使你确信它一定是NoSuchElementException,检查两次……)
  • 我认为原因是我不知道 maven 和 eclipse 具有不同的编译类状态。虽然 eclipse 总是使用最新的源代码,但我必须确保构建测试套件的父模块,然后再在 maven 中运行它。非常感谢,霍尔格。您的逻辑 POV 在这里有所帮助 :-)

标签: java eclipse maven junit osgi


【解决方案1】:

当 m2e 中的 Maven 落后时,我已经看到类似的事情发生。我会尝试以下方法来解决问题:

  1. 右键项目 -> Maven -> 更新项目。
  2. mvn clean,然后再尝试mvn install
  3. 如果这不能解决问题,请查看您的导入语句并确保它们是正确的类。
  4. 如果这些都不能解决问题,请实际检查 throwable.getClass().getName()throwable.getClass().getClassLoader() 的输出,看看它们在 Maven JUnit 和 Eclipse JUnit 中是否返回相同的输出。

顺便说一句,为什么您的 JUnit 测试中有 try-catch 块?我会这样做:

@Test(expected=NoSuchElementException.class) {
public void testNoSuchElement() {
    A.xyz(paramTriggeringNoSuchMethodException);
}

Here's the javadoc on this parameter, @Test.expected()

预计

public abstract Class<? extends Throwable> expected

可选地指定expectedThrowable,以使测试方法在方法抛出指定类的异常时成功。

默认值:

org.junit.Test.None.class

【讨论】:

  • 感谢@Test.expect 的提示。该代码是一个简化的场景,在实际场景中,在相关断言之前和之后还有一些断言。至于问题本身:正如与 Holger 的对话所揭示的那样,问题就在我身边:maven 编译的类与 eclipse 工作区不同步。
  • @erdal.karaca 我认为我帖子的第一部分应该解决这个问题。
猜你喜欢
  • 2022-11-30
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多