하루에 0.01%라도 성장하자

카테고리 없음

SpringBoot - Junit @Autowired

뚠님 2021. 6. 11. 11:03
반응형

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%이상을 차지한다고 느낀 하루였다..

( 주관적인 의견입니다.. )

 

이제... 다시 테스트 하러 가야지.

 

반응형