使用@RunWith(PowerMockRunner.class)注释时,PowerMock如何抛出异常。

5

我正在尝试使用PowerMockito工具来测试我的应用程序。我已将库添加到构建路径中。以下是我的测试类:

package client.controller;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
@PrepareForTest(System.class)
public class SampleTest
{
    @Test
    public void test()
    {

    }
}

当我尝试运行测试时,会出现以下异常:

java.lang.NoClassDefFoundError: org/junit/internal/runners/TestClassRunner
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at org.powermock.modules.junit4.legacy.PowerMockRunner.<init>(PowerMockRunner.java:24)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: org.junit.internal.runners.TestClassRunner
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 31 more

根据PowerMock常见问题解答,我应该尝试使用旧版包。 我已经尝试了,但仍然遇到相同的异常。 有什么想法吗?

1
包含 org.junit.internal.runners.TestClassRunner 的 JAR 是否在类路径上? - David Harkness
在JUnit 4.5版本和可能更早的版本中,似乎已被移除或重命名。 - David Harkness
我正在使用JUnit 4.8.2。 如何检查类路径? 如果我尝试导入该包,则Eclipse会告诉我无法解析它。 - LandonSchropp
当查看PowerMock FAQ时,它提到了用于JUnit 3的遗留包。您确定应该使用它吗? - David Harkness
1
另外,您不能像那样模拟System方法,因为它在rt.jar中,即它是一个系统类。以下是您应该遵循的步骤:http://code.google.com/p/powermock/wiki/MockSystem - bric3
@David Harkness:抱歉回复晚了。我尝试将软件包切换到旧版本,但没有帮助。 - LandonSchropp
2个回答

6
对我来说,混淆始于junit版本控制,
显然,junit版本中4.12 > 4.4。
因此,在版本 > 4.4 的情况下,您需要使用powermock-module-junit4而不是powermock-module-junit4-legacy。
作为一个附注,后来我发现我必须使用powermock-api-mockito2而不是powermock-api-mockito。
这是进步...
Maven说明: https://github.com/powermock/powermock/wiki/Mockito-Maven

3

看起来我在错误地将PowerMock添加到构建中。当我查看Eclipse中的问题视图时,我发现了以下内容:

Archive for required library: 'lib/powermock-mockito-junit-1.4.11 4/powermock-release-junit-without-mock-framework-1.4.11.pom' in project 'Test' cannot be read or is not a valid ZIP file  Test        Build path  Build Path Problem
Archive for required library: 'lib/powermock-mockito-junit-1.4.11 4/powermock-release-without-test-and-mock-framework-1.4.11.pom' in project 'Test' cannot be read or is not a valid ZIP file   Test        Build path  Build Path Problem

从构建路径中删除这两个文件解决了问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接