Spring

[SpringBoot] 스프링 부트와 테스트 기초

줘니(•̀ᴗ•́)و 2024. 5. 8. 15:06
728x90

 

 

 

--- 저를 위한 공부입니다

많은 부분이 생략되어 있습니다 ---

 

 

 

 

 

1. Application.java

 

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing	// JPA Auditing 활성화 어노테이션
@SpringBootApplication
public class Application {

    public static void main(String[] args){

        SpringApplication.run(Application.class, args);
        // 내장 WAS를 실행(톰캣 따로 설치할 필요가 없어짐)
    }

}

 

 

 

스프링부트를 사용하면 아주 익숙한!

이 Applicaion 클래스의 SpringApplication.run(Application.class, args);

내장 WAS를 실행해 서버를 가동함

 

 

 

 

 

HelloController를 예시로 스프링부트와 테스트 코드 기기기기초에 대해 알아보자

 

 

2. HelloController.java

 

import com.springboot_ex01.book.web.dto.HelloResponseDto;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

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

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

}

 

 

 

* RestController : 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줌

 

전에 SpringFramework 쓸 때 @ResponseBody를 메소드마다 선언했던 걸 하지 않고

한번에 사용할 수 있게 해준다고 생각하면 됨

 

 

 

 

3. HelloResponseDto.java

 

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {

    private final String name;
    private final int amount;
}

 

 

 

* RequiredArgsConstructor : 선언된 모든 final 필드가 포함된 생성자를 생성

→ final이 없는 필드는 생성자에 포함하지 X

 

 

 

 

 

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 returnHello() throws Exception{
        String hello = "hello";

        mvc.perform(get("/hello"))  // MockMvc를 통해 /hello 주소로 HTTP GET 요청을 함
                .andExpect(status().isOk())
                // mvc.perform의 상태 결과 검증 - 상태 200이니?
                .andExpect(content().string(hello)); 
                // mvc.perform의 응답 본문내용 결과 검증 - "hello"를 리턴하니?
    }

    @Test
    public void returnHelloDTO() throws Exception{
        String name = "hello";
        int amount = 1000;

        mvc.perform(
                        get("/hello/dto")
                                .param("name", name)
                                .param("amount", String.valueOf(amount)))       
                                // param은 String값만 허용
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name)))
                // JSON 응답값을 필드별로 검증할 수 있음, $를 기준으로 필드명 명시
                .andExpect(jsonPath("$.amount", is(amount)));

    }

}

 

 

 

 

* @RunWith(SpringRunner.class)

: 테스트 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킴

- 여기선 SpringRunner 스프링 실행자 사용 → 스프링 부트 테스트와 JUnit 사이의 연결자 역할

 

 

* @WebMvcTest(controllers = HelloController.class)

: Web에 집중할 수 있는 어노테이션

 선언할 경우 @Controller, @ControllerAdvice 등 사용할 수 있음

but, @Service, @Component, @Repository 는 사용 X

 

 

* private MockMvc mvc; 의존성 주입

: 웹 API 테스트할 때 사용, 스프링 MVC 테스트의 시작점

→ 이 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트를 할 수 있음

 

 

* returnHello() 테스트

: MockMvc를 통해 /hello 주소로 HTTP GET 요청을 하여

mvc.perform의 상태 결과를 검증하고, mvc.perform의 응답 본문 내용 결과를 검증함

→ 성공하면 Tests passed 가 나오며 테스트 끝!

 

 

* returnHelloDto() 테스트

: param 값을 보내 데이터 전송이 잘 되는지 확인

주의! ) param은 String 값만 허용함!

 

jsonPath() : JSON 응답값을 필드별로 검증할 수 있음, '$'를 기준으로 필드명 명시

ex) jsonPath("$.name", is(name))

 

 

 

 

다음 공부는 이에 이어서 Spring Data Jpa와 관계형 데이터베이스에 대해서

 

 

 

 

 

 

728x90