2014-09-23 4 views
3

Во время работы DBUnit на основе тест JUnit случае, я получаю следующее исключение:Junit: MethodNotFoundException с PowerMock

java.lang.RuntimeException: Invoking the beforeTestMethod method on PowerMock test listener [email protected] 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 

Мой класс выглядит следующим образом:

@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 является лицом без интерфейса сессионного компонента. Я не могу найти никакого объяснения нигде для этого странного исключения. Пожалуйста, дайте мне знать, если у вас есть идеи.

Спасибо.

ответ

2

Я думаю, вы используете несовместимые версии PowerMock и Mockito.

Если вы посмотрите на свой стек, вы увидите, что исключение выбрано PowerMockitoInjectingAnnotationEngine, и этот класс не может найти метод assertNoAnnotations.

Последняя версия Powermock - 1.5.6. Итак, посмотрите сейчас на src этого класса для более старой версии PowerMock (например, 1.4.12), и вы увидите, что вызывается обработанный метод assertNoAnnotations. Начиная с версии 1.5, этот класс не использует такой вызов.

Последняя версия Mockito - 1.9.5. Теперь, если вы посмотрите на src из InjectingAnnotationEngine (который продлевается на PowerMockitoInjectingAnnotationEngine) для версии Mockito 1.9.0, вы увидите, что существует метод assertNoAnnotations. И, в версии 1.9.5 - этот метод ушел.

Я думаю, что вы избавитесь от этой ошибки, обновив версии используемых вами фреймворков.

+0

Ваше решение помогло мне. Уточнение проблемы с обновлением как powermock, так и mockito до последних версий. – user613114

Смежные вопросы