类加载器问题:即使在测试中明确捕获到异常,也没有捕获到异常



这是测试场景:

Plugin A有一个实用程序类A.xyz(),它提供了一个抛出java.util.NoSuchtElementException 的方法

Plugin B提供了"功能"。

CCD_ 5,它使用CCD_。

现在,我的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,该CCD_14是使用不同的Classloader作为测试本身加载的。

BTW:当作为插件测试启动时,该测试在Eclipse中运行,但当使用mvn install 从maven运行时失败

当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);
}

这是关于这个参数@Test.expected() 的javadoc

预期

public abstract Class<? extends Throwable> expected

(可选(指定expected,即Throwable,以使测试方法在指定类的异常由该方法引发时成功。

默认值:

org.junit.Test.None.class

最新更新