PowerMock не работает с JerseyTest

Мы пишем модульные тесты для службы Jersey Java REST с использованием PowerMock. Мы должны использовать PowerMock, потому что мы используем множество статических методов в устаревшей системе. Мы используем PowerMock с EasyMock. Всякий раз, когда мы пытаемся унаследовать от JerseyTest, весь фреймворк терпит неудачу.

Это основанный на gradle проект, и уместно build.gradle линии ниже.

testCompile 'junit:junit:4.12'
testCompile group: 'org.easymock', name: 'easymock', version: '3.5.1'
testCompile group: 'org.easymock', name: 'easymockclassextension', version: '3.2'
testCompile group: 'org.powermock', name: 'powermock-module-junit4', version: '1.7.3'
testCompile group: 'org.powermock', name: 'powermock-api-easymock', version: '1.7.3'

У нас есть несколько модульных тестов EasyMock, поэтому мы знаем, что наш импорт работает правильно. Проблема в том, что, поскольку мы тестируем веб-сервис Jersey, наши модульные тесты наследуются от JerseyTest. Написание модульного теста PowerMock без наследования от JerseyTest работает нормально. Но когда мы пытаемся унаследовать от JerseyTest, все это разваливается. Google подвел нас (очевидно, никто другой, кто написал веб-сервис на Джерси, не пытался использовать PowerMock).

То, что мы делаем, довольно просто. Это работает:

@RunWith(PowerMockRunner.class)
public class PowerMockTest {

    private final static String TARGET = "ourwebservice/";

    @Test
    public void testConfigurationGet() {
        // do stuff, but no Jersey web service calls
    }
}

Однако, изменив объявление класса для наследования от JerseyTest:

public class PowerMockTest extends JerseyTest {

И мы получаем полный провал. Мы используем Eclipse в качестве нашей IDE, и это ошибка, которая отображается в окне JUnit:

initializationError (0.000 s)

Окно Failure Trace дает более подробную информацию:

java.lang.VerifyError: Inconsistent stackmap frames at branch target 38
Exception Details:
  Location:
    com/ourcompany/ourproduct/rest/PowerMockTest.<init>()V @38: aload_1
Reason:
Type uninitializedThis (current frame, locals[1]) is not assignable to 'com/ourcompany/ourproduct/rest/PowerMockTest' (stack map, locals[1])
  Current Frame:
    bci: @24
    flags: { flagThisUninit }
    locals: { uninitializedThis, uninitializedThis, top, 'java/lang/Object' }
    stack: { 'java/lang/Object', 'java/lang/Object' }
  Stackmap Frame:
    bci: @38
    flags: { flagThisUninit }
    locals: { uninitializedThis, 'com/ourcompany/ourproduct/rest/PowerMockTest' }
    stack: { }
  Bytecode:
    0x0000000: 2a4c 1211 b800 1703 bd00 1912 1ab8 001e
    0x0000010: b800 244e 2db2 0028 a500 0e2a 01c0 002a
    0x0000020: b700 2ea7 0009 2bb7 0030 0157 a700 0301
    0x0000030: 3a05 2ab8 0036 b1                      
  Stackmap Table:
    append_frame(@38,Object[#14])
    chop_frame(@44,1)
    same_frame(@47)

    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetPublicMethods(Class.java:2902)
    at java.lang.Class.getMethods(Class.java:1615)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.getTestMethods(PowerMockJUnit44RunnerDelegateImpl.java:109)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.<init>(PowerMockJUnit44RunnerDelegateImpl.java:85)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl.<init>(PowerMockJUnit47RunnerDelegateImpl.java:42)
    at org.powermock.modules.junit4.internal.impl.PowerMockJUnit49RunnerDelegateImpl.<init>(PowerMockJUnit49RunnerDelegateImpl.java:25)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:172)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:48)
    at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:108)
    at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.<init>(JUnit4TestSuiteChunkerImpl.java:71)
    at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.<init>(AbstractCommonPowerMockRunner.java:36)
    at org.powermock.modules.junit4.PowerMockRunner.<init>(PowerMockRunner.java:34)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:87)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:73)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:46)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:522)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

Мы даже не можем войти в метод для его отладки; до этого он терпит неудачу (обратите внимание, что тест на самом деле еще ничего не делает; мы просто пытаемся сначала что-то настроить).

У кого-нибудь есть идеи, что происходит? У нас есть какая-то ошибка конфигурации? Должны ли мы перейти на Mockito?

0 ответов

Другие вопросы по тегам