3.0 RC1의 개발에 다들 열심히 달리고 있지만 120여개의 이슈는 그다지 줄어들 줄을 모른다. 몇달 전 예상했던 8월 말이라는 3.0 릴리스 예상시기도 이미 오버했고, 앞으로 얼마나 더 갈지는 아무도 모른다. 로드 맵에는 예상 일자가 아예 빠져있다.

JUnit 이슈

최근에 들려온 반가운 소식은 대대적인 변화가 있었던 JUnit 4.5버전 이후 계속 우왕좌왕 하는 디자인결정으로 JUnit 지원 프레임워크들을 애먹여 왔던 JUnit  BlockJUnit4ClassRunner 코드의 문제를 Sam Brannen이 간신히 해결했다는 것이다. 최근에 픽스된 JUnit 이슈에 대한 유겐과 쌤의 코멘트를 잘 읽어보면 어떤 문제들이 발생했는지를 대충 알 수 있을 것이다. 로드 존슨이 초창기부터 설계하고 발전시켜왔던 JUnit지원 테스트 클래스 계층을 제끼고 화려하게 등장해서 인기몰이를 한 스프링 테스트 컨텍스트 프레임워크 개발의 주인공인 Sam Brannen이, 이 JUnit의 갈팡질팡하는 변화에 대응하느라 얼마나 힘들었던지 “솔직이 JUnit 기능 지원은 심한 악몽 같다”고 까지 이야기했다.

사실 이번 픽스도 JUnit 4.5-4.7 사이에서 에러없이 호환이 되게 동작하는데 성공했을 뿐이지 @deprecated된 메소드의 문제와 Rule의 적용은 여전히 답이 보이지 않는 막막한 상황이다. 아무리 라이브러리 버전이 호환된다고 해도 4.7의 핵심인 @Rule이 동작하지 않는데 4.7 지원이라는 것이 별 의미가 없다.

비슷하게 JUnit을 확장한 Runner를 지원하는 (@Mock용이던가) Mockito 최신 소스를 살펴봤다. JUnit을 비교적 간단히 이용하는 편이지만 Runner의 문제는 별 다를바 없었다. 그나마 @Mock정도만 지원하면 되니까 BlockJUnit4ClassRunner 만 상속해서 before부분만 override하면 그만이었지만, 이제 곧 private으로 바뀌면 당장 Rule로 지원을 바꾸지 않으면 안될 운명이다. Mockito코드를 살펴보니 JUnit 버전을 확인해서 그 버전에 맞게 만들어진 Runner 클래스를 릐플렉션으로 다이나믹하게 생성해서 동작시키도록 되어있다. 결국 4.5,4.6,4.7… 용으로 제각각 만들어지는 것을 감수하겠다는 것 같다.

스프링의 TestContext Framework의 DI를 이용한 자유로운 확장구조와 JUnit의 고정된 Statement 블록을 만드는 코드는 정말이지 너무 비교된다. 이번 켄트 벡 세미나에서 이 JUnit에 대한 디자인의 고민에 대한 이야기가 나올지 두고봐야겠다. 과연 뭐라고 설명하려나.

아무리 그래도 메소드 visibility를 버전이 늘어날 때마다 private->protected->private으로 바꾸었던 것은 정말 심했다. 스프링은 결국 이 왔다 갔다하는 makeNotifier메소드로 인한 호환실패의 문제를 해결하기 위해서 아예 그 메소드를 호출하는 메소드 자체를 오버라이드 해서 스프링이 코드를 배껴서 만든 별도의 springMakeNotifier를 호출하는 방법으로 해결했다. 이런 땜빵질이라니 참 눈물겹다.

버전업

각종 최신 라이브러리들에 대한 지원이 늘고 있다. Hibernate 3.5나 EclipseLink 2.0.0.M7(JPA 2.0), AspectJ 1.6.5, EHCache 1.6.0 등이 눈에 띄는 변화들이다. 빠르기도 하다.

Deprecated된 @NotTransactional

아직 릴리스되지 않은 개발중인 프레임워크를 가지고 책을 쓰다보니 난감할 때가 종종있다. 순서에 따라 내용이 들어가야 하는데 아직 관련 기능이 업그레이드 예고만 되고 개발안된 경우가 하나의 문제고, 더 큰 당황스러움은 이미 내용을 다 넣었는데 뒤늦게 제거되거나 바뀌는 기능들이다. 어흑..

트랜잭셔널 테스트에서 사용하는 @NotTransactional 애노테이션이 최근 deprecated되어버렸다. 이게 로드 존슨이 처음 만든 것이지만 JUnit 3.8시절의 클래스 단위로 트랜잭션 적용여부가 결정되던 시절의 유물이라는 이유로 감히 사용이 비추되고 삭제될 운명에 처했다. 문제는 이게 이미 스프링 책에서 끝낸 챕터의 내용에 들어있다는 것. 어휴.. 가뜩이나 진도 나가기 힘든데, 이제는 있는 것도 빠지는 구나. 게다가 앞뒤에 응용 설명까지 달아놨는데 몽창 바꿔야 겠다. @deprecated된 것을 그냥 소개해버리면 망신이니 놔둘 수도 없고…

이에 관해서 스프링 팀이 권장하는 non-transactional 테스트 처리는, 아예 @Tranasctional이 아닌 클래스로 빼거나, 트랜잭션이 시작되기 전이나 후에 동작하는 @BeforeTransctional과 @AfterTransactional을 이용하라는 것이다.

거기에 내가 한가지 보태자면 @Transactional의 정의(속성)을 NOT_SUPPORT 같은 것으로 설정하는 방법도 있기는 하다.

기타 변경된 사항은 최근에 한번 정리했다는 RC1 change log를 보도록. 사실 바뀐 건 많은데 log에는 달랑 3개 뿐이다.

Related posts:

  1. Spring 3.0 (49) JUnit 4.7로 변경과 상속의 폐해
  2. JUnit 4.7 분석 (1) JUnit 4.7 코드 첫인상
  3. JUnit 4.7과 OCP
  4. JUnit 4.7 분석 (0) 시작
  5. JUnit Max – Kent Beck
  6. JUnitMax Core가 포함된 JUnit 4.6 릴리스
  7. JUnit assert 매쉬업
  8. Spring 3.0 (41) @Deprecated SpringMVC
  9. Spring 3.0 (51) @Rule 지원성공 그리고 Formatter, ConversionService의 전면 등장
  10. Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (3)
  11. Spring 3.0 (42) Spring Dependency Matrix 업데이트
  12. Spring 3.0 EL (Spel)을 이용한 AssertThrows 확장 (1)
  13. Spring 3.0 (19) Test 모듈의 선택라이브러리 분석
  14. Spring 3.0 (38) Spring Reference 업데이트
  15. Spring 3.0 (3) R-543 Portlet Mocks, MVC 등등

Facebook comments:

to “Spring 3.0 (50) JUnit 4.5~4.7 겨우 지원성공 그리고 계속되는 악몽”

  1. This actually is my very first time i go to here. I found so plentiful entertaining stuff in your weblog, chiefly its dialogue. In the lots of critiques in your articles, I guess I’m not the only 1 developing all the leisure here! Keep up the very good work.

  2. I just want to tell you that I’m newbie to blogging and definitely liked you’re web-site. Probably I’m want to bookmark your blog post . You surely have superb posts. Regards for sharing with us your web page.

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha