[Fast Campus] 한번에 끝내는 Java/Spring : JUnit

Player-Geun·2022년 1월 17일
0

✨ Junit 란

TDD(Test Driven Development)

테스트 주도 개발에서 사용하지만, 코드의 유지 보수 및 운영 환경에서의 에러를 미리 방지 하기 위해서 단위 별로 검증 하는 테스트 프레임워크

단위테스트

작성한 코드가 기대하는 대로 동작을 하는지 검증하는 절차

JUnit

Java 기반의 단위 테스트를 위한 프레임 워크, Annotation 기반으로 테스트를 지원하며, Assert를 통하여 예상, 실제를 통해 검증




✨ REST API CRUD 테스트

@ SpringBootTest

등록된 모든 Bean을 올림

@ WebMvcTest(Calculator.class)

필요한 Bean만 올림(Calculator 클래스만)

@ WebAppConfiguration

Controller 및 Web 환경에 사용되는 빈을 자동으로 생성하여 등록

Get Test

@WebMvcTest(CalculatorApiController.class)
@AutoConfigureWebMvc
@Import({Calculator.class, DollarCalculator.class})
public class CalculatorApiControllerTest(){
	
    @MockBean
    private MarketApi marketApi;
    
    @Autowired
    private MockMvc mockMvc;
    
    @BeforeEach
    public void init(){
    
    	Mockito.when(marketApi.connect()).thenReturn(3000);
    }
    
    @Test
    public void sumTest() throws Exception{
    
    	// http://localhost:8080/api/sum
        
        mockMvc.perform(
        	MockMvcRequestBuilders.get("http://localhost:8080/api/sum")
            		.queryparam("x", "10")
                	.queryparam("y", "10")
        ).andExpect(
        	MockMvcResultMatchers.status().isOk()
        ).andExpect(
        	MockMvcResultMathcers.content().string("60000")
        ).andDo(MockMvcResultHandlers.print());
        
    }
}
        
   

MockMvc

웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC 환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스

👉 컨트롤러 테스를 하고싶을 때 실제 서버에 구현한 애플리케이션을 올리지 않고(서블릿 컨테이너 사용X) 테스트용으로 시물레이션하여 MVC가 되도록 도와주는 클래스

Mock

가짜 객체라고 불리며, 검증하기 위해 사용되는 객체

💥 가짜 객체를 만드는 이유

  • 실제 객체를 만드는데 드는 시간 절약
  • 의존성이 많이 연결된 경우, 구현의 복잡함을 피하기 위해

@Mock & @MockBean

Mock 객체를 선언할 때 쓰이는 어노테이션

💥 차이

  • spring Boot Container가 테스트에 필요하고, Bean이 Container에 존재한다면 @MockBean 사용, 아닌 경우 @Mock

Post Test

    @Test
    public void minusTest() throws Exception{
    
    	Req req = new Req();
        req.setX(10);
        req.setY(10);
        
        String json = new ObjectMapper().writeValueAsString(req);		//json으로 변환
        
        mockMvc.perform(
        	MockMvcRequestBuilders.post("http://localhost:8080/api/minus")
            		.contentType(MediaType.APPLICATION_JSON)
                	.content(json)
        ).andExpect(
        	MockMvcResultMatchers.status().isOk()
        ).andExpect(
        	MockMvcResultMathcers.jsonPath("$.result").value("0")
        ).andExpect(
        	MockMvcResultMathcers.jsonPath("$.result.resultCode").value("OK")	//json 데이터 내부의 객체 데이터 지정
        ).andDo(MockMvcResultHandlers.print());
        
    }
   
    

💥 Jacoco

Java 코드의 코드 커버리지를 체크하는 라이브러리(ex. 테스트가 어디까지 작성되어있나)
결과를 html, xml, csv로 확인이 가능


📝 마치며

토이 프로젝트 위주의 1인 개발만 주로 해왔던 나는 일일이 TDD를 하는 것이 훨쒼 귀찮았다. 실행시켜 브라우저로 확인해보면서 디버깅하는게 편하지만, 실무의 대규모 프로젝트에 대비하기 위해 토이 프로젝트에서부터 TDD에 익숙해지는 것이 필요하다고 생각했다.

profile
주니어 개발자

0개의 댓글