IDE/IntelliJ

IntelliJ_스프링 부트에서 테스트 코드 작성하기

개발계발게발 2021. 9. 29. 19:13
반응형

IntelliJ_스프링 부트에서 테스크 코드 작성하기

 

테스트 코드 이점

  • 단위 테스트는 개발 단계 초기에 문제를 발견하게 도와준다.
  • 단위 테스트는 개발자가 나중에 코드를 리팩토링하거나 라이브러리 업그레이 등에서 기존 기능이 올바르게 작동 하는지 확인할 수 있다.(ex.회귀 테스트)
  • 단위 테스트는 기능에 대한 불확실성을 감소시킬 수 있다.
  • 단위 테스트는 시스테멩 대한 실제 문서를 제공한다. 즉, 단위 테스트 자체가 문서로 사용할 수 있다.

 

Hello Controller 테스트 코드 작성하기

 

패키지 생성

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

ex) admin.jojoldu.com - > 패키지명은 com.jojoldu.admin

 

Application 클래스 및 HelloController 클래스 생성

 

package com.IntelliJProject.book.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args){
        SpringApplication.run(Application.class, args);
    }
}

Application 클래스 코드 작성

 

package com.IntelliJProject.book.springboot.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}

HelloController 클래스 코드 작성

 

 

테스트 코드로 검증

 

package com.InteglliJProject.book.springboot.web;

import com.IntelliJProject.book.springboot.web.HelloController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
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;



@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.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));
    }
}

test폴더에 동일 패키지 생성 후 HelloControllerTest 클래스 작성

 

코드 작성 후 테스트 메소드 실행

 

 

테스트 메소드 실행 통과

 

Application.java 파일 main 메소드 실행 -> 정상 작동

 

롬복 추가

build.gradle -> compile('org.projectlombok:lombok')

 

Action 검색(Ctrl + Shift + A)

 

Pulgins -> Marketplace 이동 lombok 검색

 

Lombok 설치 -> 재시작

 

 

file > settings (단축키 ctrl + alt + s)

 

Enable annotation processing 체크

 

 

HelloController를 롬복으로 전환하기

 

com.IntelliJProject.book.springboot.web.dto -> HelloResponseDto 클래스 생성

 

package com.IntelliJProject.book.springboot.web.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
    private final String name;
    private final int amount;
}

HelloResponseDto 코드 작성

 

package com.IntelliJProject.book.springboot.web.dto;

import org.junit.Test;
import static org.assertj.core.api.Java6Assertions.assertThat;

public class HelloResponseDtoTest {
    @Test
    public void lombok_test(){
        //given
        String name = "test";
        int amount = 1000;

        //when
        HelloResponseDto dto = new HelloResponseDto(name, amount);

        //then
        assertThat(dto.getName()).isEqualTo(name);
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}

HelloResponseDtoTest 클래스 작성후 코드 작성

 

 

HelloControllerTest 코드 작성

package com.IntelliJProject.book.springboot.web;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;


@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
    @Autowired
    private MockMvc mvc;

    @Test
    public void hello_return() throws Exception{
        String hello = "hello";

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
    @Test
    public void helloDto_return() throws Exception{
        String name = "hello";
        int amount = 1000;

        mvc.perform(
                get("/hello/dto")
                        .param("name", name)
                        .param("amount", String.valueOf(amount)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name)))
                .andExpect(jsonPath("$.amount", is(amount)));
    }
}

테스트 코드 정상 작동

반응형