类加载器问题:即使明确陷入测试,也不会捕获异常

时间:2014-06-27 09:01:39

标签: java eclipse maven junit osgi

这是测试场景:

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加载mvn install作为测试本身。

BTW:测试在作为插件测试启动时在Eclipse中运行,但是当使用{{1}}从maven运行时失败

1 个答案:

答案 0 :(得分:0)

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

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

  5. 顺便说一下,为什么你的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