studio programacion para móviles libro edición desarrollo curso comandos cluster aplicaciones java maven powermock javassist

java - programacion - Error en el método<init> desde dentro de una rama



manual de programacion android pdf (3)

Después de actualizar JDK a java7u65, varias pruebas unitarias utilizando Mockito y PowerMock comenzaron a fallar con las siguientes causas:

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


Tuve el mismo problema ya que el proyecto se construyó en jdk1.8.0_51 y tuve jdk1.8.0_11 en mi máquina. El proyecto se ejecuta con éxito después de actualizar a jdk1.8.0_51 en la máquina.


Tuvo el mismo problema con java8 y lo resolvió usando -noverify


ACTUALIZAR

Hay nuevas versiones de java7 que solucionan este problema. Como está escrito en respuesta a Powermock / Javassist crea constructores ilegales para JDK 1.7.0u65 y 1.8.0u11 con -target 7 # 525

la actualización de Java 7u71 a 7u75 solucionó el problema

Causa principal

Tras la investigación, escuché los gritos de ayuda de todas partes de Internet de todas las herramientas e idiomas que se basan en JDK.

Resulta que la causa es el nuevo estándar de bytecode de Java que se comprueba con el nuevo verificador. Pero desafortunadamente, powermock le pide a javassist que produzca cambios en el código de bytes que ya no son aceptados por este nuevo brillante brillo.

Solución alternativa (para aquellos que no pueden usar java más nuevo)

Como solución en el blog de JRebel , sugirieron usar el indicador -noverificar al iniciar JVM. Sin embargo, encontré en Java 7 Bytecode Verifier: enorme paso hacia atrás para la solución alternativa de la publicación de JVM que funciona en java7: -XX: -UseSplitVerifier

Como mis pruebas se ejecutan en un servidor inaccesible y se ejecutan como parte de Maven Build, necesitaba encontrar una manera de pasar ese argumento junto con los archivos de mi proyecto. La primera solución viable que descubrí es agregar este parámetro a la configuración del complemento surefire en pom.xml de la siguiente manera:

<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>

Supongo que en java8 se podría usar un método similar para llamar a las pruebas con la tecla -noverificar , pero no he tenido la oportunidad de confirmarlo.

Otros recursos relacionados para vigilar

Powermock / Javassist crea constructores ilegales para JDK 1.7.0u65 y 1.8.0u11 con -target 7. Powermock / Javassist crea constructores ilegales para JDK 1.7.0u65 y 1.8.0u11 con -target 7 # 525