본문 바로가기

Programing/JVM(Java, Kotlin)

[Java 11] 자바11 에서 테스트가 깨진다!?

Spock Framework 로 테스트 코드를 짜고 있다.

이상하게 자바8에서는 잘 동작하던 것이 11에서 깨지는 것이 발견되었다.

 

두 개의 테스트가 실패했는데 공통점은 인터페이스를 익명클래스로 상속해서 오버라이딩하는 부류의 코드였다.

결국 Spock Framework에서 제공하는 Stub()으로 그 인터페이스를 대체했더니 사라지긴 했다.

 

에러 스택은 아래와 같았다. 클래스로더가 테스트 메소드에서 오버라이딩한 클래스를 로딩을 못하는 느낌이 든다. (모듈 때문일까?)

java.lang.ClassFormatError: Illegal method name "어떤 테스트..." in class com/tistory/namocom/service/FooSpec$1
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	at com.tistory.namocom.service.FooSpec.어떤 테스트...(FooSpec.groovy:115)

추가적으로 JAXB가 없어져서 에러가 난다!

Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
	at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:278)
	at javax.xml.bind.ContextFinder.find(ContextFinder.java:421)
	at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:721)
	at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:662)
	at org.springframework.http.converter.xml.AbstractJaxb2HttpMessageConverter.getJaxbContext(AbstractJaxb2HttpMessageConverter.java:112)
	... 11 more
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
	at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
	at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:276)

해결책은 javax.xml.bind:jaxb-api 를 의존성에 추가를 하면 된다.

 

다른 프로젝트를 하다보니 추가적으로 의존성들을 추가해주어야 하는 것들이 있었다.

JAXB API JSR 181 APIJSR 224 API 등.

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.jws</groupId>
    <artifactId>jsr181-api</artifactId>
    <version>1.0-MR1</version>
</dependency>
<dependency>
    <groupId>javax.xml.ws</groupId>
    <artifactId>jaxws-api</artifactId>
    <version>2.3.1</version>
</dependency>