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 API 및 JSR 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>
'Programing > JVM(Java, Kotlin)' 카테고리의 다른 글
[Java] 내가 사용하는 GC 알고리즘은 무엇일까? (0) | 2020.04.07 |
---|---|
[Java] JMM 에 대한 글들 (0) | 2020.03.25 |
[Java] Object.hashCode JavaDoc - History (0) | 2020.01.29 |
[Java] "서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없다."? (0) | 2020.01.28 |
[java] Java 8의 시간은 10000년을 파싱 못한다? (0) | 2020.01.23 |