我正在使用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库工作吗?
在使用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 当我执行(或)时,我希望运行单个单元测试并失败。