SpringBoot 에서 Junit 을 처음으로 실행해 보았다.
우선 너무 어려웠고.. 생각보다 봐줘야 하는 설정이 너무 많아서 삽질하면서 이것저것 해본게 너무 많아 기억이 안날 정도.
더 기억을 잃기전에.. 미리 기록하고자 글을 남긴다.
개발 환경
1. Spring Boot version - 2.0.2 RELEASE
2. JUnit version - JUnit4 를 쓰려고 했는데 javaTest Runner라는 Extensions 를 설치하여 해결하였음.
3. IDE - VSCode
고난
1. 우선 SpringBoot 라는게 어려웠음..
- 누가 그랬는데.. Spring은 설정이 반이라고. 이거 거짓말입니다. 설정이 90% 이상입니다 이거
2. VSCode
- 현재 팀에서 VSCode를 IDE로 잡고 SpringBoot를 개발하고 있는데, 우선 VSCode로 Spring을 하는 레퍼런스가 너무 없음.
- 그래서 구글링 해도 설정이 90% 이상인 Spring에서 ClassPath를 변경하는 아주 간단한 작업조차 어려움을 느꼈음..
- IntelliJ야 그립다.
3. 지식
- 우선 나는 안드로이드 개발자기 때문에 아무래도 서버 전문 개발자 보다 Spring 베이스 지식이 너무 부족함.
- 단순히 때려맞추기나 코드 복사 붙여넣기로 해결할 수 있는 수준이 아니었다..
- 머리로 이해 안가는 어노테이션들이 Spring 생태계에서는 이해가 되어야 하는데, 잘 모르고, 또 잘 모르다보니 아 이게 문제네! 라고 명확하게 트러블 슈팅이 되지 않음.
- Exception 많음. 하
테스트 할 코드
TestService.java
public class TestService{
@Autowired
TestMapper tm;
public String testFunc(){
String resultStr = ts.getShowText();
return resultStr;
}
UnitTest.java
public class UnitTest{
public void unitTest1(){
TestService ts = new TestService();
ts.testFunc();
assertEquals(ts.testFunc(), "테스트입니다.");
}
위 코드는 내가 실제로 짠 코드와 유사한 구조다.
1. TestService에서 @Autowired를 이용해 ts를 가져다 쓰는 중.
2. UnitTest에서 TestService를 선언해서 testFunc(); 를 호출함.
3. testFunc()의 리턴값과 "테스트입니다."를 비교하여 결과 산출
이렇게 코드를 작성하고 어찌저찌 테스트코드를 실행했는데, 왠걸 TertService 내에 있는 TestMapper가 Null 로 떨어진다.
그래서 계속 NullPointException 발생.
TestMapper가 null이니까 당연히 testFunc()를 호출 할 수 없음..
원인 분석
스프링을 잘 모르는 나는 어떤 문제가 있는지 확인하려고 구글링을 겁나게 했는데
이 Exception 메세지가 너무 포괄적이라서 구글링을 해도 너무 뜬금없는 이야기들만 나왔다.
특히나 vscode에 맞는 솔루션을 찾기는 하늘에 별따기였다.
( 이클립스 여전히 많이 쓰더라.. )
계속 찾다가 ' 이거 Autowired로 연결된 ts가 null로 떨어진다는 건.. Autowired를 관리하는 SpringApplication 파일을 불러오지 않아서 인가. 싶어서 찾기 시작했고
@ContextConfiguration(classes = SpringApplication.class)
이 어노테이션을 찾아서 넣었다.
그러니 스프링은 실행되었으나, null 로 찍히는 문제는 해결되지 않았다.
이걸로 거의 3시간 넘게 사용하고 있던 찰나, 더이상 시간을 할애할 수 없어서 ( 프로젝트 해야지.. )
서버 전문가 지인에게 문의하였더니 굉장히 빠르게 끝났다.
' 형 그거 UnitTest에 선언된 TesrService는 스프링에 관리되지 않고 있어여. @Autowired 써서 관리해여'
즉 무슨 말이냐면
UnitTest.java
@SpringBootTest
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = SpringApplication.class)
public class UnitTest {
@Autowired
TestService ts;
public void unitTest1(){
// TestService ts = new TestService();
ts.testFunc();
assertEquals(ts.testFunc(), "테스트입니다.");
}
}
이렇게 ContextConfiguration을 추가하여 스프링 의존성을 선언하고
@Autowired를 이용해서 TestService를 불러오고
불러온 TeserService를 통해 testFunc()를 호출 하면 끗.
휴.. 엄청 고생했는데 우선 원인을 찾아서 기쁘고
너무 쉽게 끝나서 허무한.. ㅋㅋ
진짜 설정이나 어노테이션이 스프링의 90%이상을 차지한다고 느낀 하루였다..
( 주관적인 의견입니다.. )
이제... 다시 테스트 하러 가야지.