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 |