Spring 3.0 (49) JUnit 4.7로 변경과 상속의 폐해

VMWare 인수 소식이 들린 후 3.0 작업이 더 더딘 것 같다. 다들 파티 하느라고 바쁜가보다. –_-.

아무튼 어제 올라온 VMWare인수 결정 후 첫 3.0 업데이트는 JUnit과 TestNG의 버전업. JUnit은 나온지 얼마 되지 않는 4.7로 전격 업그레이드 되었다. TestNG는 뭐 업글 됐겠지만 관심밖이니까.

JUnit 4.7은 일부 버그가 수정되었고 Rule방식이 도입된 것을 제외하면 4.6과 호환된다. 따라서 이번 변경은 단지 라이브러리 버전 업그레이드일 뿐이다. 적어도 아직까지는 4.7로 버전을 올리는 것이면 충분하다.

하지만 이제부터가 진짜 고민의 시작이다.

이전에 JUnit 4.7에 대해서 이야기했던 것처럼 4.7의 주요 테스트 메소드 실행 기능들은 Rule로 바꿀 것을 권장하면서 모두 @deprecated되었다.

문제는  JUnit의 상속을 통한 확장을 강제하는 구조 덕분에 스프링의 SpringJUnit4ClassRunner를 사용해야 하는 테스트컨텍스트 프레임워크는 이 @deprecated된 메소드들을 사용하도록 만들어져있다는 것이다. 따라서 4.7로 업그레이드 하면서 이 SpringJUnit4ClassRunner에는 deprecated된 메소드를 호출한다는 경고가 뜬다. 경고정도야 무시한다 쳐도, 공고한대로 JUnit 다음버전에서 withBefores, withAfters같은 @Before, @After를 처리하는 메소드들을 모두 private으로 바꾸거나 아예 삭제해버린다면 SpringJUnit4ClassRunner를 모두 뜯어고쳐야 할 수 밖에 없게 된다.

따라서 JUnit다음 버전을 위해서라면 기존의 JUnit 메소드를 복사해다가 이름을 바꾸고 고쳐서 쓰던가 비슷한 것을 직접 구현할 수 밖에 없다. 스프링 사용자들이 Rule방식으로 모두 전환해서 사용하도록 강제하고 기존 버전으로 만들어진 테스트는 함께 쓰도록 막을 것이 아니라면 결국 Rule기능을 지원하는 핵심 메소드인 methodBlock자체를 override해서 다시 만들어야 할 수 밖에 없다.

사실 methodBlock은 이미 스프링에서 테스트컨텍스트를 지원하기 위해서 독자적인 구조로 변경되어있다. 이대로라면 JUnit 4.7을 쓴다고 해도 스프링 테스트 안에서는 @Rule은 무시 된다. Rule을 지원하도록 코드를 수정해주면 가능하긴 하겠지만 아무튼 지금은 안된다. 결국 절름발이 업그레이드인 것이다. 이렇게 JUnit을 통해서 상속의 폐해인 깨지기 쉬운 기반클래스의 문제를 경험해 보는 것인가.

시간이 지나면 어떻게든 스프링은 새로운 Rule구조를 지원하는 테스트를 만들어내긴 하겠지만, 결국엔 methodBlock과 같은 JUnit의 핵심 작업흐름을 모두 재구성하고 비슷한 기능을 재구현하는 것을 택하지 않을 수 없다. 기존 JUnit4스프링 테스트와 같은 방식의 동작을 보장하게 묘수를 내지 못하면 결국 JUnit4를 지원하는 또다른 러너인 SpringJUnit4RuleClassRunner가 따로 나오게 될지도 모르겠다.

두고보자.

Leave a comment

Your comment