본문 바로가기
스프링부트와 AWS

#3-1_스프링부트에서 테스트 코드를 작성 + 인텔리제이 테스트 코드 작성시 cannot resolve symbol 에러 해결방법

by Meaning_ 2021. 7. 21.
728x90
반응형

TDD와 단위테스트 


TDD는 테스트가 주도하는 개발 -> 테스트코드를 먼저 작성하는 것에서부터 시작

 

- 항상 실패하는 테스트를 먼저 작성

- 테스트가 통과하는 프로덕션 코드 작성

- 테스트가 통과하면 프로덕션 코드를 리팩토링한다.

 

단위테스트는 TDD의 첫번째 단계인 기능 단위의 테스트 코드 작성을 뜻함.

 

 

테스트 코드를 작성해야 하는 이유


작가님의 말씀에 의하면

1) 빠른 피드백

 

  1. 코드 작성
  2. Tomcat 실행
  3. Postman 과 같은 API 테스트 도구로 HTTP 요청
  4. 요청결과를 System.out.println() 으로 눈으로 검증
  5. 결과가 다르면 다시 Tomcat 중지하고 코드 수정

2번부터 5번까지 매번 코드를 수정할때 마다 반복해야 하는데, 톰캣을 재시작하는데는 1분이상의 시간이 소요되기 때문에 테스트 코드를 작성하면 톰캣을 재시작할 필요가 없다.

 

2) 자동 검증

 

보통 System.out.println()을 써서 수동 검증을 하지만, 테스트 코드를 작성하면 그럴 필요가 없다.

 

3) 개발자가 만든 기능을 안전하게 보호해줌

 

새로운 기능이 추가될때, 기존 기능이 잘 작동되는 것을 보장해준다.

 

테스트 코드 작성을 도와주는 프레임워크 

 

JUnit - Java

DBUnit - DB

CppUnit - C++

NUnit - .net

 

Hello Controller 테스트 코드 작성 


src->main->java->New->Package로 가서 새로운 패키지를 하나 생성헤 준다

일반적으로 패키지 명은 웹사이트 주소의 역순이다. 

나는 build.gradle 파일의 group id 를 그대로 썼다. (group id도 도메인 네임을 거꾸로 적는다고 한다)

 

생성한 패키지를 오른쪽 클릭한 후 ->New ->Class

클래스 이름은 Application으로 해준다.

위의 사진 처럼 적어주면 된다.

 

Application 클래스 -> 앞으로 만들 프로젝트의 메인 클래스가 된다

 

main메서드에서 실행하는 Spring.Application.run 으로 인해 내장 WAS (Web Application Server) 가 실행된다. 내장 WAS는 별도로 외부에 WAS를 두지 않고 애플리케이션을 실행할 때 내부에서 WAS를 실행하는 것을 말한다. 

이는 항상 서버에 톰캣을 설치할 필요가 없고, 스프링부트로 만들어진 Jar파일(실행가능한 Java 패키징 파일)로 실행하면 된다.

내장 WAS의 장점은 '언제 어디서나 같은 환경에서 스프링부트를 배포'할 수 있다는 것이다. 외장 WAS를 쓰는 겨우, 모든 서버는 WAS의 종류와 버전, 설정을 일치시켜야 한다. 그렇기에 새로운 서버가 추가되면, 모든 서버가 같은 WAS환경을 구축해야하기 때문에 비효율적일 수 있다.

 

 

@RestController

 

-> 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어준다.

예전에는 @ResponseBody 를 각 메소드마다 선언했던 것을 한번에 사용할 수 있게 해주는 것으로 보면된다. 

 

@GetMapping

 

-> HTTP Method인 Get의 요청을 받을 수 있는 API를 만들어준다.

예전에는 @RequestMapping(method= RequestMethod.GET)으로 사용되었다. 이제 프로젝트는 /hello 요청이 오면 문자열 hello로 반환하는 기능을 가지게 된다.  

 

 

 

cf) HTTP의 Get메서드 

GET 메소드는 주로 데이터를 읽거나(Read) 검색(Retrieve)할 때에 사용되는 메소드이다. 만약에 GET요청이 성공적으로 이루어진다면 XML이나 JSON과 함께 200 (Ok) HTTP 응답 코드를 리턴한다.

 

 


테스트 코드를 검증하기 위해서 src->test->java 디렉토리에 아까 생성한 com.~으로 시작하는 패키지를 똑같이 생성하고 하위에 web 폴더를 만든다 -> web 폴더에 새로운 java 클래스를 만들고, 이름을 HelloControllerTest라고 지어준다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import org.junit.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.ResultActions;
 
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(controllers =HelloController.class)
@ExtendWith(SpringExtension.class)
public class HelloControllerTest {
    @Autowired
    private MockMvc mvc;
 
    @Test
    public void hello가_리턴된다()throws Exception{
        String hello="hello";
        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
 
    }
}
cs

 


 

하지만 cannot resolve symbol에러가 떴다! 특히 첫번째 줄의 import org.junit.Test; 부터 읽어들이지 못했다..ㅜㅜ

 

그래서 해결방법은 

@Test 어노테이션에 스크롤을 갖다대고 Alt+Enter키를 눌러서 'Add 'Junit 5.4' to classpath'를 클릭해주면 Test의 annotation이 빨간색에서 노란색으로 변한다 

 

 

file->project structure->+ -> from maven 클릭 하고 저 사진 처럼 org.junit.jupiter ~~ 저거 그대로 써서 수동으로 라이브러리 설정해주면 된다.

 

인텔리제이 공식문서 링크를 들어가면 더 자세히 설명되어 있다!

 

https://www.jetbrains.com/help/idea/testing.html#add-testing-libraries

 

Prepare for testing | IntelliJ IDEA

 

www.jetbrains.com

 

하지만 막상 컴파일을 시켜보면 java.lang.illegalaccesserror: class lombok.javac.apt.lombokprocessor <-- 이 에러가 떴다

 

나는 이미 롬복이 설치되어있는 상태이기에 롬복 오류라고 생각했기에 우선, HelloControllerTest 코드를 롬복으로 전환 시켜주었다.

 


https://we1cometomeanings.tistory.com/66

 

#3-2_스프링부트에서 테스트코드 작성 +java.lang.NullPointerException 에러 해결방법

HelloControllerTest를 롬복으로 전환하기 앞으로 모든 응답 Dto는 이 Dto패키지에 추가해줄 것이다. main ->java-.web에 dto패키지를 추가시켜준다 HelloResponseDto 클래스를 만들고, 1 2 3 4 5 6 7 8 9 10 11 1..

we1cometomeanings.tistory.com

 

 

 

cf) pom.xml 파일 만들기 + gradle에서 No candidates found for method~  오류 떴을 때 해결법

 

 project -> 맨 상단의 모듈 오른쪽 클릭 ->Add framework support ->왼쪽의 maven 체크표시 ->ok 

그러면 이렇게 pom.xml 파일이 뜬다!

 

보통 pom.xml파일을 새로 만들거나 여기서 수정을 하면  build.gradle에서 No candidates found for method~ 오류가 나서 help->Find Action->reload all gradle projects를 검색했다. 그러면 다시 원상태로 돌아옴!

 

아래 링크를 참고했다

https://118k.tistory.com/970

 

[intellij] Gradle 사용시 No candidates found for method call plugins. 오류 해결방법

intellij에서 그래들을 이용하여 빌드를 할 때 build.gradle 파일에서 "No candidates found for method call plugins." 오류가 발생하는 경우가 있습니다. Reload All Gradle Projects 처리 Help > Find Action >..

118k.tistory.com

 

728x90
반응형

댓글