java - Junit:使用 PowerMock 的 MethodNotFoundException

标签 java exception junit powermock dbunit

在运行基于 DBUnit 的 junit 测试用例时,出现以下异常:

java.lang.RuntimeException: Invoking the beforeTestMethod method on PowerMock test listener org.powermock.api.extension.listener.AnnotationEnabler@2a5f1994 failed.
    at org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:92)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:292)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:84)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:34)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:44)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:118)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:102)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    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: org.powermock.reflect.exceptions.MethodNotFoundException: No method found with name 'assertNoAnnotations' with parameter types: [ java.lang.reflect.Field, [Ljava.lang.Class; ] in class org.powermock.api.mockito.internal.configuration.PowerMockitoInjectingAnnotationEngine.
    at org.powermock.reflect.internal.WhiteboxImpl.throwExceptionIfMethodWasNotFound(WhiteboxImpl.java:1247)
    at org.powermock.reflect.internal.WhiteboxImpl.findMethodOrThrowException(WhiteboxImpl.java:985)
    at org.powermock.reflect.internal.WhiteboxImpl.doInvokeMethod(WhiteboxImpl.java:882)
    at org.powermock.reflect.internal.WhiteboxImpl.invokeMethod(WhiteboxImpl.java:713)
    at org.powermock.reflect.Whitebox.invokeMethod(Whitebox.java:401)
    at org.powermock.api.mockito.internal.configuration.PowerMockitoInjectingAnnotationEngine.process(PowerMockitoInjectingAnnotationEngine.java:45)
    at org.powermock.api.extension.listener.AnnotationEnabler.injectSpiesAndInjectToSetters(AnnotationEnabler.java:55)
    at org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:50)
    at org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:90)
    ... 18 more

我的类(class)看起来像:

@RunWith(PowerMockRunner.class)
public class SampleDbTest extends {

    /** service mock */
    @InjectMocks
    private TestService testService;

    /** entity manager. */
    EntityManager                    entityManager;

    /**
     * Sets the up.
     * 
     * @throws Exception the exception
     */
    @Before
    public final void setUp() throws Exception {
        // get entity manager
        injectField(testService, "entityManager", entityManager);
    }
    ....
    ....

这里的 TestService 是无状态 session bean 接口(interface)。对于这个奇怪的异常,我无法在任何地方找到任何解释。如果您有任何想法,请告诉我。

谢谢。

最佳答案

我认为您使用的 PowerMock 和 Mockito 版本不兼容。

如果您查看堆栈跟踪,您会发现 PowerMockitoInjectingAnnotationEngine 抛出了该异常,并且此类找不到 assertNoAnnotations 方法。

Powermock 的最新版本是 1.5.6。因此,现在查看此类的旧版本 PowerMock(1.4.12,例如)的 src,您会看到已处理 assertNoAnnotations 方法的调用。从 1.5 开始版本,此类不使用此类调用。

Mockito 的最新版本是 1.9.5。现在,如果您查看 1.9.0InjectingAnnotationEngine(由 PowerMockitoInjectingAnnotationEngine 扩展)的 src Mockito 的版本,你会看到,有 assertNoAnnotations 方法持续存在。并且,在 1.9.5 version - 这个方法没有了。

我认为,您将通过更新您使用的框架版本来消除此错误。

关于java - Junit:使用 PowerMock 的 MethodNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25988270/

相关文章:

android - 如何在 Android Studio v0.5.2 中运行单独的测试方法

java - Junit 4 测试覆盖率

java - 使用 jackson 从改造中反序列化 json,其中相同的变量名可以代表两个不同的对象

java - 如何从 NumberLong 获取日期时间

java - Java动态Web项目中的sqlite db文件保存在哪里?

java - 自定义异常处理 - java Web 服务

ruby - Rubyist 捕获救援 block 中引发的异常的方法是什么?

java - 如何在 Java 中访问自定义 Exception 类中的非构造函数方法?

java - JUnit 测试类失败测试

java - 获取类的数组列表的索引。 java