열렬히.뛰기

2. 테스트 코드 작성하기

웹 프로그래밍 > Spring > 스프링부트 공부 (1) > 2. 테스트 코드 작성하기

2.1 테스트 코드란?

2.2 Hello Controller 테스트 코드 작성법

★ 빌드 전에 꼭 해주기

  1. 위쪽 메뉴에서 파일을 찾는다.
  2. 파일 설정빌드, 실행, 배포빌드 도구Gradle
  3. Gradle 프로젝트 밑에
    • 빌드 및 실행 찾기
    • 다음을 사용하여 빌드 및 실행 : Intellij IDEA로 바꿔주기
    • 다음을 사용하여 빌드 및 실행 : Intellij IDEA로 바꿔주기

안 하면 실행/디버그 시 다음과 같은 오류가 뜬다.

No tests found for given includes: 
[org.example.web.HelloControllerTest](--tests filter)

HelloController 코드

java
// 2.2장
@RestController
public class HelloController {

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

2.3 롬북 소개 및 설치하기

★ lombok 깔아주기

없으면 스프링부트 플러그인에 들어가 깔아야 한다.

★ build.gradle에 코드 추가

build.gradle에 ‘org.projectlombok: lombok’을 추가해준다.
java
buildscript {
    ext {
        springBootVersion = '2.1.7.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    // 1장
    implementation('org.springframework.boot:spring-boot-starter-web')
    testImplementation('org.springframework.boot:spring-boot-starter-test')

    // 2.3장 롬북
    implementation('org.projectlombok:lombok')
}

test {
    useJUnitPlatform()
}

깔고 나서 새로고침 버튼을 누른다.

2.4 Hello controller 코드를 롬북으로!

dto 패키지

  1. web 패키지 안에 dto 패키지를 만들어 준다.

  2. HelloResponseDto 라는 자바 클래스를 만든다.

  3. HelloReponseDtoTest를 test에 만들어준다.

    코드
    java
    package org.example.web.dto;
    
    import org.junit.Test;
    import static org.assertj.core.api.Assertions.assertThat;
    
    // 2.4장
    public class HelloResponseDtoTest {
        @Test
        public void lombok_function_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);
        }
    }
    
    • assertj :
      • 추가적인 라이브러리가 필요 없음
      • 자동완성이 확실하게 지원됨

★ 오류 출력 시

다음과 같은 오류가 날 경우:

java
java: variable name not initialized in the default constructor
  1. build.gradle 수정이 필요하다.
java
dependencies {
    // 1장
    implementation('org.springframework.boot:spring-boot-starter-web')
    testImplementation('org.springframework.boot:spring-boot-starter-test')

    // 2.3장 롬북
    // 2.4장
    annotationProcessor 'org.projectlombok:lombok'
    implementation 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.projectlombok:lombok'    
}
  1. enable annotation … 설정이 뜰 경우 enable을 눌러준다.

HelloController에 코드 추가

java
// 2.2장
@RestController
public class HelloController {

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

// 2.4장 롬북
    @GetMapping("/hello/dto")
    public HelloResponseDto helloDto (@RequestParam("name") String name, @RequestParam("amount") int amount) {
        return new HelloResponseDto(name, amount);
    }
}

HelloControllerTest에 코드 추가

java
// 2.4장에서 추가
import static org.hamcrest.Matchers.is; // 직접추가
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; // 직접추가
java
// 2.2장
@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

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

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
// 2.4장
    @Test
    public void return_helloDto() 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))
        );
    }
}