Java 类路径顺序因JUnit runner而异

Java 类路径顺序因JUnit runner而异,java,maven,junit,classpath,Java,Maven,Junit,Classpath,我面临着一个问题,它看起来与中暴露的问题相似,但我认为不同,希望更容易解决 我有一个单元测试类TestMyClass,它测试MyClass,而MyClass恰好有一个对log4j记录器的静态引用 当我使用@RunWith(MockitoJUnitRunner.class)运行TestMyClass时,记录器的初始化工作正常。但是当我使用@RunWith(PowerMockRunner.class)运行测试时,log4j在初始化记录器时记录了以下错误: log4j:错误“org.apache.lo

我面临着一个问题,它看起来与中暴露的问题相似,但我认为不同,希望更容易解决

我有一个单元测试类
TestMyClass
,它测试
MyClass
,而
MyClass
恰好有一个对log4j记录器的静态引用

当我使用
@RunWith(MockitoJUnitRunner.class)
运行
TestMyClas
s时,记录器的初始化工作正常。但是当我使用
@RunWith(PowerMockRunner.class)
运行测试时,log4j在初始化记录器时记录了以下错误:

log4j:错误“org.apache.log4j.xml.DOMConfigurator”对象不能分配给“org.apache.log4j.spi.Configurator”变量。
log4j:ERROR类“org.apache.log4j.spi.Configurator”是由
log4j:错误[org.powermock.core.classloader]。MockClassLoader@1ad186f]而类型为
的对象 log4j:[sun.misc.Launcher]加载了错误“org.apache.log4j.xml.DOMConfigurator”$AppClassLoader@13f5d07].
log4j:错误无法实例化configurator[org.apache.log4j.xml.DOMConfigurator]

我发现发生这种情况是因为以下代码段在log4j初始化代码中返回
false

Configurator.class.isAssignableFrom(DOMConfigurator.class)
这应该是真的,
DomConfigurator
实现了
Configurator
,但我认为它返回false,因为我碰巧在类路径上有两个版本的这些类:一个来自log4j-1.2.14,另一个来自log4j-extras-1.1。我假设当使用
PowerMockRunner
运行测试时,这两个类不是从同一个jar加载的(请告诉我是否还有其他原因)

因此,我想了解:

  • 我为什么要面对这个问题?为什么类路径顺序会因使用的JUnit运行程序而异?它不应该是确定性的吗
  • 有没有办法绕过这个问题

N.B.:我必须使用
PowerMockRunner
,因为我需要模拟静态调用。我无法摆脱其中一个log4j jar,因为它们都是我的项目的依赖项的依赖项。这个问题并没有使我的测试失败,它只是打印了这些错误,但解决它还是很好的。

我不再记得我们为什么要这样做了,但是我们使用PowerMock模拟静态方法的一个测试类在顶部,就在@PrepareForTest注释下面:

@PowerMockIgnore({ "org.apache.log4j.*", "org.apache.commons.logging.*" })
中的数字5给出了可能需要这样做的几个原因,并提出了其他解决方案。忽略log4j对我们有用


另外,我们正在使用PowerMock 1.5.1。

我不确定我是如何错过了常见问题解答的这一部分,但它也非常适合我。谢谢