728x90
반응형

자, 간단하게 시작하고 끝내보자! (뭐?)

 

우선 Spring 프로젝트가 있어야 하겠다. 만드는 법은 이 글을 통해 확인하면된다. 여하간 테스트를 위한 방법을 서술하는거니까 차때고 포때고, 마상은 서비스로 나눠주고 왕부터 잡아보자. 가장 핵심이 되는 라이브러리는 junit 라이브러리와 spring-test 라이브러리 이다.

 

다들 STS를 이용하여 Spring MVC Project를 만들었다는 가정하에 진행해보도록 하겠다.

첫번째로 해야할 일은 라이브러리를 등록하고 빌드하는 것이다.

 

위 코드를 pom.xml에 추가하고 저장하면 빌드가 될것이다.

 

 

다음은 테스트를 위한 코드를 만드는 것이다.

끝이다. 여기서 homeService는 실제로 작동할 서비스를 인젝션해주면된다. 한마디로 위의 TestController클래스는 “컨트롤러 인척” 하는 놈이 되시겠다.

이 클래스에서 눈여겨 볼 점은 @Runwith, @ContextConfiguration, @Test 이 세가지다. 솔직히 junit의 모든것은 @Test 이게 전부다. 물론, 모든 라이브러리가 그렇겠지만 안중요한게 어디있고 안복잡한게 어디있겠냐만은.. 본 포스트에서는 @Test 이거만 쓰자는 거니 오해하지말자.

@Runwith 어노테이션은 파라미터를 보면 알겠지만 SpringContext를 테스트용으로 구동하기위해 환경을 잡아주겠다는 표시로 생각하면 되겠다. 거기에 대한 상세 환경설정파일은 다음 어노테이션에서 명시하고 있다.

@ContextConfiguration 어노테이션의 파라미터의 경우 약간 첨언을 해드리자면, file:src/main/ … 을 이용한 접근도 가능하고, classpath: 를 통한 접근도 가능하다. 편한대로 사용해주면 된다. 이렇게 불러온 context.xml들은 실제로 서버가 로드될때 불러지는 xml을 불러도 좋고, 테스트용으로 새로 만들어 접근시켜도 상관없다. 다만, 테스트용이 아닌 실제 배포용 xml을 불러들이는 경우, 테스트 환경을 위하여 내부 값이 변경될 필요가 있다면 필히 신중하게 핸들링하거나 애초에 테스트 코드를 빼두는 것이 좋다.

@Test 어노테이션은 junit을 구동할때, 이 어노테이션이 붙은 구간을 테스트 하겠다는 것이다. test메서드 위에 붙여놨으니 junit을 통해 TestController를 구동할경우 test메서드를 찾아서 junit이 단위테스트를 진행해줄것이다.

자, 이제 준비가 끝났으니 junit을 굴려보자.

 

 

제목 없음

junit을 통한 단위테스트 대상 클래스를 우클릭 -> Run As -> JUnit Test 를 선택하면된다.

 

그럼 한 번에…

 

java.lang.NoClassDefFoundError: org/springframework/core/annotation/AnnotatedElementUtils
at org.springframework.test.util.MetaAnnotationUtils$AnnotationDescriptor.<init>(MetaAnnotationUtils.java:289)
at org.springframework.test.util.MetaAnnotationUtils$UntypedAnnotationDescriptor.<init>(MetaAnnotationUtils.java:349)
at org.springframework.test.util.MetaAnnotationUtils$UntypedAnnotationDescriptor.<init>(MetaAnnotationUtils.java:344)
at org.springframework.test.util.MetaAnnotationUtils.findAnnotationDescriptorForTypes(MetaAnnotationUtils.java:191)
at org.springframework.test.util.MetaAnnotationUtils.findAnnotationDescriptorForTypes(MetaAnnotationUtils.java:208)
at org.springframework.test.util.MetaAnnotationUtils.findAnnotationDescriptorForTypes(MetaAnnotationUtils.java:166)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:271)
at org.springframework.test.context.DefaultTestContext.<init>(DefaultTestContext.java:67)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:103)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:124)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:115)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.ClassNotFoundException: org.springframework.core.annotation.AnnotatedElementUtils
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
… 29 more

 

 

58654e84f7977ed14258f91efe7a8395

이게 무슨 소리요…

 

걱정하지말자.. 잘따라왔으면 위 에러는 나지 않을 것이다. 혹.시. 이 에러가 발생했다면 맨 위에 pom.xml 설정했던 ${org.springframework-version} 이 부분에 대해 짚고 넘어가야한다. 또는 이 에러때문에 찾아들어왔을 지도 모르겠지만.. 이 포스팅을 써야겠다고 생각한 원인이기도하고… (부들부들)

 

다음은 ${org.springframework-version} 에 대한 설정 구간이다.

잘 보면 알겠지만 xml 전문이 아니니 그대로 복사해서 xml에 붙여넣는 일은 절대절대 하지말자.(스프링이 아파해요)

위 xml에서 properties구간에 설정한 org.springframework-version의 값이 3.2.0.RELEASE로 설정되어 있는 것을 확인할 수 있다. 즉, ${org.springframework-version}이라는 구간은 이 properties에 설정된 값을 빌려쓰는 일종의 jsp에서의 EL과 같은 역할을 하는 것이고, 이를 통해 필자의 STS는 “3.2.0.RELEASE”를 기본값으로 spring-tx, spring-aop, spring-context 등등 모든 부분의 버전을 맞추어 주고 있다. 차후에 버전업이 필요하면 properties의 org.springframework-version값만 변경해주면된다.

서두는 이 정도로 하고, 결론부터 말하자면 spring-test와 spring의 버전이 맞지 않아서 발생한 오류이다. 필자는 최초 pom 작성시 애초에 spring-test도 버전을 입력하는 부분을 4.10 등으로 입력했었는데, 이것이 3.2.0.RELEASE로 설정된 부분과 맞지 않아 발생한 에러였다. 여러분은 그러지 않길 빌며… (검색어에 ClassNot을 치고 들어왔다면… 뭐 그냥.. 안됐다….)

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,