배경
운영중인 프로젝트 JDK 버전을 1.6에서 1.7로 버전업하는 작업을 진행하게 되었다. 버전 변경을 위해 pom.xml의 maven-compiler-plugin의 속성인 <source>와 <target>을 1.7로 수정하였고, TC를 수행하였는데 다음과 같은 에러가 발생하였다.
원인
문제는 PowerMock과 JDK 1.7간 버전 충돌이였으며, 그 이유는 JDK 1.7부터 바이트코드를 검증할 때 StackMapTable을 반드시 체크하도록 변경 되었기 때문이다. 이 방식은 기존 바이트코드 검증 방식과 호환성이 유지되지 않는다.
(개인적으로 PowerMock을 통해 static 영역을 mocking 하는 테스트 케이스가 더 문제라 생각한다.)
해결
자바 옵션에 -XX:-UseSplitVerifier 추가하여 해결하였다. 해당 옵션은 기존 방식으로 바이트코드를 검증한다는 의미로서, 사실 해결책이라기 보단 회피 방법이라고 보는 것이 좀 더 적합할 것 같다.
또한 JAVA 8에서는 해당 옵션이 deprecated 되었으니, 최종적으로 PowermockRunner를 사용하는 테스트 케이스를 수정하는 것이 좋을 것 같다.
참고자료
- http://stackoverflow.com/questions/15253173/how-safe-is-it-to-use-xx-usesplitverifier
- http://blog.triona.de/development/jee/how-to-use-powermock-with-java-7.html