Проблема с PowerMock при имитации статического метода с конструкцией Java7

У меня возникла проблема с имитацией статического теста с моим кодом, скомпилированным с помощью Java7.

Я комментирую свой тест jUnit аннотациями

 @RunWith(PowerMockRunner.class)
 @PrepareForTest(StaticClassToMock.class)

При запуске моего теста и попытке издеваться над моим статическим классом с помощью

PowerMockito.mockStatic(StaticClassToMock.class);

он возвращается

java.lang.VerifyError: JVMVRFY012 stack shape inconsistent [...]

Если в StaticClassToMock я удаляю конструкции Java7, заменяя перехваченные исключения в OR и помещая их в каскад, все работает нормально.

Я видел, что последняя версия Powemock (1.6.6) скомпилирована с Java6.

Связана ли моя проблема с конструкциями Java7, когда PowerMock скомпилирован с Java6?

Спасибо


person flavio    schedule 22.11.2016    source источник


Ответы (1)


Это то, что касается PowerMock — добро пожаловать в его причудливые ошибки.

Первый вопрос: используете ли вы IBM JDK? Потому что IBM JDK и PowerMock становятся еще более «странными», чем Oracle/OpenJDK и PowerMock.

Если вы выполните поиск, вы найдете множество потенциальных подсказок:

  1. VerifyError на WAS
  2. Код не работает с Java7< /а>

В любом случае, первый ответ будет таким: просто попробуйте, если запуск вашей JVM с использованием -noverify имеет какое-либо значение.

Более длинный ответ: если вы не тестируете сторонний код, который вы не можете изменить; подумайте... не используйте статический код так, чтобы вы обращались к PowerMock.

Видите ли, статичность — это прежде всего ненормальность хорошего объектно-ориентированного дизайна. Его следует использовать с большой осторожностью; так как это создает прямую связь с вашим кодом. Проще говоря: использование static — это один из самых простых способов создать код, который сложно/невозможно протестировать! Поэтому, если вы хотите изменить свой код, вы можете посмотреть эти видео, чтобы узнать, как для создания тестируемого кода. И тогда ваша потребность обратиться к PowerMock... просто отпадет.

Мои личные два цента: я потратил много часов на поиск таких проблем с PowerMock. Затем мы решили сделать другой дизайн, который допускает только статический контент, который не нарушает наше обычное модульное тестирование. С тех пор мы прекрасно живем с EasyMock и Mockito. PowerMock больше не нужен; больше не нужно часами отлаживать проблемы, которые не имеют отношения к нашему производственному коду; но только насмешливая структура.

person GhostCat    schedule 23.11.2016
comment
Спасибо за ваше объяснение GhostCat, я полностью согласен с вашими замечаниями о статическом коде и IBM JDK. К сожалению, я расширяю код IBM, и нет возможности изменить существующий. В любом случае мне удалось решить эту проблему: это было из-за библиотеки oldjavassist. Обновление его до более нового решило мою проблему. Большое спасибо! - person flavio; 24.11.2016