Подтвердить что ты не робот

Плохой вызов <init> метода изнутри ветки

После обновления JDK до java7u65 несколько модульных тестов с использованием Mockito и PowerMock начали сбой следующими причинами:

15:15:23,807 INFO  - Tests in error: 
15:15:23,810 INFO  -   initializationError(com.your.ClassHere): Bad <init> method call from inside of a branch
4b9b3361

Ответ 1

UPDATE

Есть новые версии java7, которые исправляют эту проблему. Как написано в ответ на Powermock/Javassist создает незаконные конструкторы для JDK 1.7.0u65 и 1.8.0u11 с -target 7 # 525

Обновление с java 7u71 до 7u75 устраняло проблему

Rootcause

После расследования я услышал крики о помощи со всего Интернета со всех инструментов и языков, которые были построены на JDK.

Оказывается, причиной является новый стандарт байт-кода java, который проверяется новым верификатором. Но, к сожалению, javassist иногда попросил powermock произвести изменения в байт-код, которые больше не принимаются этим новым блестящим очень хорошим.

Обходной путь (для тех, кто не может перейти с более новой java)

В качестве обходного пути в блог JRebel они предложили использовать -noverify при запуске JVM Однако я нашел из Java 7 Bytecode Verifier: Огромный шаг назад для JVM. Альтернативное обходное сообщение в блоге, которое работает на java7: -XX: - UseSplitVerifier

Поскольку мои тесты выполняются на некотором недоступном сервере и выполняются как часть сборки maven, мне нужно найти способ передать этот аргумент вместе с файлами проекта. Первое работоспособное решение, которое я обнаружил, - это добавить этот параметр в конфигурацию плагина surefire в pom.xml следующим образом:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.10</version>
            <configuration>
                <argLine>-XX:-UseSplitVerifier</argLine>
            </configuration>
        </plugin>
        <plugin>
    </plugins>
</build>

Я полагаю, что на java8 можно было использовать аналогичный метод для вызова тестов с помощью клавиши -noverify, но у него не было возможности подтвердить это.

Другие связанные ресурсы, чтобы следить за

Powermock/Javassist создает незаконные конструкторы для JDK 1.7.0u65 и 1.8.0u11 с -target 7. Powermock/Javassist создает незаконные конструкторы для JDK 1.7.0u65 и 1.8.0u11 с -target 7 # 525

Ответ 2

Имела ту же проблему с java8 и разрешала ее с помощью -noverify

Ответ 3

У меня была такая же проблема, как проект был построен на jdk1.8.0_51, и у меня был jdk1.8.0_11 на моей машине. Проект запускается успешно после обновления до jdk1.8.0_51 на машине.