본문 바로가기

강의/토비의 스프링부트

테스트 코드

api 기능 테스트

package com.example.tobyboot;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;

import static org.assertj.core.api.Assertions.assertThat;

class TobybootApiTest {
    @Test
    void helloApi() {
        // http localhost:8080/hello?name=spring
        // HTTPie
        // http 요청을 보낼때는 restTemplate을 사용한다.
        // 그러나
        TestRestTemplate rest = new TestRestTemplate();
        // body 부분이 String으로 되어있다.
        // body 가 json으로 되어있을 때는 dto로 받을 수 있겠다.
        ResponseEntity<String> res = rest.getForEntity("http://localhost:8080/hello?name={name}", String.class, "Spring");

        // status code 200
        assertThat(res.getStatusCode()).isEqualTo(HttpStatus.OK);
        // header (content-type) text/plain
        assertThat(res.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE)).startsWith(MediaType.TEXT_PLAIN_VALUE);
        // body Hello Spring
        assertThat(res.getBody()).isEqualTo("Hello Spring");
    }

    @Test
    void failsHelloApi() {
        TestRestTemplate rest = new TestRestTemplate();
        // body 부분이 String으로 되어있다.
        // body 가 json으로 되어있을 때는 dto로 받을 수 있겠다.
        ResponseEntity<String> res = rest.getForEntity("http://localhost:8080/hello?name={name}", String.class);

        // 프로그램 버그, 서버의 심각한 상황 -> 500 에러
        // 클라이언트가 값을 잘못 보냈을 때는 400번대 에러를 반납하는게 좋다.
        assertThat(res.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

 

 

package com.example.tobyboot;

import com.example.tobyboot.toby.SimpleHelloService;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class HelloServiceTest {

    @Test
    void simpleHelloService() {
        SimpleHelloService helloService = new SimpleHelloService();
        String res = helloService.sayHello("Test");

        Assertions.assertThat(res).isEqualTo("Hello Test");
    }
}

 

package com.example.tobyboot;

import com.example.tobyboot.toby.HelloController;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.*;

public class HelloControllerTest {

    // 정상 케이스 테스트
    @Test
    void helloController() {
        HelloController helloController = new HelloController(name -> name);

        String ret = helloController.hello("Test");

        assertThat(ret).isEqualTo("Test");
    }

    // 비정상도 테스트 가정
    @Test
    void failsHelloController() {
        HelloController helloController = new HelloController(name -> name);

        assertThatThrownBy(() -> {
            helloController.hello(null);
        }).isInstanceOf(IllegalArgumentException.class);

        assertThatThrownBy(() -> {
            helloController.hello("");
        }).isInstanceOf(IllegalArgumentException.class);
    }
}

 

 

package com.example.tobyboot.toby;

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

import java.util.Objects;

@RequestMapping("/hello")
@RestController
public class HelloController {

    private final HelloService helloService;

    public HelloController(HelloService helloService) {
        this.helloService = helloService;
    }

    @GetMapping
    @ResponseBody
    public String hello(String name) {
        if (name == null || name.trim().length() == 0) throw new IllegalArgumentException();

        return helloService.sayHello(name);
    }
}

 

package com.example.tobyboot.toby;

import org.springframework.stereotype.Service;

@Service
public class SimpleHelloService implements HelloService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }
}

'강의 > 토비의 스프링부트' 카테고리의 다른 글

자동 구성 기반 애플리케이션 (meta annotation, composed annotation)  (0) 2023.02.23
ㅇㄹㄴㅇ  (0) 2023.02.22
Bean의 생명주기 메소  (0) 2023.02.21
자바코드 구성 정보 사용  (0) 2023.02.21
di 적용  (0) 2023.02.20