Powermock驱动的测试通过maven运行得很好但不在intellij中运行

时间:2016-12-26 20:14:55

标签: java maven unit-testing intellij-idea powermock

我有一个非常大的项目,在某些时候开发人员开始注意到如果他们尝试在intellij中运行/调试PowerMock驱动的测试 - 他们会收到以下错误:

java.lang.NoClassDefFoundError: org/powermock/core/transformers/impl/MainMockTransformer
FATAL ERROR in native method: processing of -javaagent failed
    at org.powermock.modules.agent.PowerMockClassTransformer.<clinit>(PowerMockClassTransformer.java:41)
    at org.powermock.modules.agent.PowerMockAgent.<clinit>(PowerMockAgent.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.ClassNotFoundException: org.powermock.core.transformers.impl.MainMockTransformer
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 8 more

我们正在使用powermockagent,单元测试通常如下所示:

@PrepareForTest({Bla.class})
public class BlaTest {

    @Rule
    public PowerMockRule rule = new PowerMockRule();

    static {
        PowerMockAgent.initializeIfNeeded();
    }

    @Test public void test() { ... }
 }

有趣的是,如果我禁用 dynamic.path,问题就会消失,但我认为这是一种解决方法,而不是解决方案,因为我在其他场景中需要dynamic.path。

Powermock版本:1.6.3 | Junit版本:4.11 | Intellij版本:2016.3

我会感激任何见解。

2 个答案:

答案 0 :(得分:1)

原来this is a known issue 解决方法是将IDEA_CONFIG / options / options.xml中的属性idea.dynamic.classpath.jar设置为true。

请注意,由于another know issue,它首先设置为false。

这非常麻烦,但这是目前最好的(2017年3月)。

答案 1 :(得分:1)

对我来说,它通过更改测试配置设置shorten command line而起作用。 我将其从classpath file更改为JAR manifest。 它位于Run -> Edit Configurations中。只要确保您为正在运行的测试更改了正确的配置即可。

enter image description here