当前位置: 首页 > 面试题库 >

仅当由Maven执行时,使用Reflections Google库的单元测试才会失败

岳奇逸
2023-03-14
问题内容

我正在使用Google
Reflections库查询类路径中的某些资源。这些资源与我的项目中的类位于相同的位置。

我编写了一些单元测试,这些单元测试在Eclipse中作为单元测试执行时会成功,但是当我尝试使用Maven(maven install例如使用a
)执行它们时,它们无法按预期运行。经过一些调试之后,显然的问题在于,当用Maven执行时,Reflections库无法找到资源所在的类路径URL。

我得出了这个结论,研究了Reflections如何确定应检查的类路径URL。例如,以下方法显示了Reflections如何在给定类加载器的情况下找到可用的类路径URL(原始的Reflections方法已被简化了一点):

public static Set<URL> forClassLoader(ClassLoader... classLoaders) {
    final Set<URL> result = Sets.newHashSet();
    for (ClassLoader classLoader : classLoaders) {
        while (classLoader != null) {
            if (classLoader instanceof URLClassLoader) {
                URL[] urls = ((URLClassLoader) classLoader).getURLs();
                if (urls != null) {
                    result.addAll(Sets.<URL>newHashSet(urls));
                }
            } 
            classLoader = classLoader.getParent();
        }
    }
    return result;
}

简而言之,它遍历类加载器层次结构,要求每个单独的类加载器的URL。

在Eclipse中时,我使用类似这样的内容从单元测试中调用先前的方法:

    ClassLoader myClassClassLoader = <MyClass>.class.getClassLoader(); //<MyClass> is in the same classpath url than the resources I need to find
    Set<URL> urls = forClassLoader(myClassClassLoader);
    for(URL url : urls) {
      System.out.println("a url: " + url);

如预期的那样,我可以看到(在许多其他URL中)作为项目一部分配置的类路径URL:

file:<MY_PROJECT_PATH>/target/classes/
file:<MY_PROJECT_PATH>/target/test-classes/

和Reflections起到了魅力的作用(Reflections应该在其中找到的资源file:<MY_PROJECT_PATH>/target/classes/)。

但是,当测试由Maven执行时,我意识到该forClassLoader方法返回的集合中缺少这些URL条目,并且其余的Reflections方法无法按预期解决此问题。

“令人惊讶”的事情是,如果我在通过maven执行单元测试时编写了此代码

ClassLoader myClassClassLoader = <MyClass>.class.getClassLoader();
url = myClassClassLoader.getResource("anExistingResource");
System.out.println("URL: "+url); //a valid URL

我可以看到类加载器仍然可以解析我要查找的资源。我感到困惑的是,为什么使用Maven执行该forClassLoader方法时,虽然它能够解析位于此类urls(!)中的资源,但该方法未包含在返回的项目集中我项目的类路径URL。

这种行为的原因是什么?当作为Maven运行的单元测试的一部分被调用时,有什么变通办法可以尝试使Reflections库工作吗?


问题答案:

您可能正在使用M2Eclipse,它会自行向类路径添加内容。命令行Maven的工作方式有所不同。您可能会发现一些有用的选项。



 类似资料:
  • 在使用maven运行单元测试时,我遇到了这个异常。我的所有测试都没有执行。我的测试类的格式是 我正在运行以下命令来运行此命令: 使用的surefire插件是: 有人知道为什么我的测试没有执行吗?我用的是jUnit 4.8.2和surefire 2.14.1

  • 问题内容: 我正在使用Jenkins,Maven 3.1和Java 1.6。我在詹金斯(Jenkins)建立了以下Maven职位,并具有以下目标和选择… 下面是我的pom.xml surefire配置… 但是,当我的单元测试失败时,Jenkins控制台输出仍然显示“ BUILD SUCCESS”,并且该构建被标记为“不稳定”,而不是完全失败。我如何在Jenkins(如果事实如此,则为Maven)中

  • 我使用的是Jenkins、Maven3.1和Java1.6。我有以下的Maven工作设置在詹金斯与以下目标和选择...

  • 我有一个春靴项目。我已经在.../src/test/java/...中编写了单元测试。目录。我的所有单元测试的形式都是*test.java。当我运行“MVN测试”时,我得到以下输出: 在这方面的任何帮助都是非常感谢的。 我没有展示我的全部POM。以下是Junit的内容:

  • 问题内容: 编辑:切换到一个更好的示例,并阐明了为什么这是一个真正的问题。 我想用Python编写在断言失败时继续执行的单元测试,这样我就可以在一个测试中看到多个失败。例如: 在这里,测试的目的是确保Car’s正确设置其字段。我可以将其分解为四个方法(这通常是个好主意),但是在这种情况下,我认为将其保留为测试单个概念的单个方法(“对象已正确初始化”)更容易理解。 如果我们认为最好不要破坏该方法,那

  • 在以前的一个项目中,我使用Spock测试框架对Java代码进行单元测试。我发现这非常有效,所以我尝试将Spock测试添加到我当前的项目中,该项目使用Maven作为构建工具(前一个项目使用Gradle)。虽然我可以让Maven编译我的Spock测试(使用),但我无法让Maven运行这些测试。 我做了一个简单的例子来演示我在两个文件中的问题: null 当我执行(或)时,我希望运行单个单元测试并失败。