TDD

์‹ค์ „! ์Šคํ”„๋ง๋ถ€ํŠธ ์ƒํ’ˆ-์ฃผ๋ฌธ API ๊ฐœ๋ฐœ๋กœ ์•Œ์•„๋ณด๋Š” TDD ๊ฐ•์˜๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

์ƒํ’ˆ ๋“ฑ๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

POJO

Java POJO Test

(1) ํ•„์š”ํ•œ ์„œ๋น„์Šค ํ˜ธ์ถœ

productService.addProduct(request);
  • ํ•„์š”ํ•œ ๋™์ž‘์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค๋งŒ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

(2) ์„œ๋น„์Šค ํ˜ธ์ถœ์— ํ•„์š”ํ•œ Request ํด๋ž˜์Šค ์ƒ์„ฑ

final AddProductRequest request = new AddProductRequest(name, price, discountPolicy);
  • Request ํด๋ž˜์Šค๋Š” record ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • Assert ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒ€์ฆ

(3) ์„œ๋น„์Šค ํด๋ž˜์Šค ์ƒ์„ฑ

  • ๋„๋ฉ”์ธ ํด๋ž˜์Šค ์ƒ์„ฑ

(4) ์–ด๋Œ‘ํ„ฐ ์ƒ์„ฑ

(5) ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ์ƒ์„ฑ

  • ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฉ”๋ชจ๋ฆฌ(Map)๋กœ ๊ด€๋ฆฌ

Then -> Given -> When ์ˆœ์„œ๋กœ ์ ์„ฑํ•ด ๋ณด๊ธฐ

ProductService addProduct test

.

Move Inner class for test to Upper level

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์ž‘์„ฑ๋œ inner class ๋“ค์„ main class ๋กœ ์ด๋™

  • F6 ๋‹จ์ถ•ํ‚ค ํ™œ์šฉ

Move Inner class for test to Upper leve

์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

์ˆœ์ˆ˜ ์ž๋ฐ”๋กœ ๊ตฌํ˜„๋œ ์„œ๋น„์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์Šคํ”„๋ง ๋ถ€ํŠธ ํ…Œ์ŠคํŠธ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์ „ํ™˜

  • service, adapter, repository ํด๋ž˜์Šค์— @Component ์„ ์–ธ

  • ๊ธฐ์กด ํ…Œ์ŠคํŠธ์— @SpringBootTest ์„ ์–ธ ๋ฐ ์„œ๋น„์Šค๋Š” @Autowired ๋กœ ์ฃผ์ž…

์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

API ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด io.rest-assured:rest-assured ์‚ฌ์šฉํ•˜๊ธฐ

  • rest-assured ๋Š” ๊ฒฉ๋ฆฌ๊ฐ€ ์ž˜ ์•ˆ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์กด์žฌ

API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

in-memory to jpa

rest-assured ํ…Œ์ŠคํŠธ ๊ฒฉ๋ฆฌ ์ฝ”๋“œ ์ถ”๊ฐ€

JPA ์ ์šฉํ•˜๊ธฐ

๊ธฐ์กด in-memory ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ jpa ๋กœ ์ ์šฉ

JPA ์ ์šฉํ•˜๊ธฐ

์ƒํ’ˆ ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

์ƒํ’ˆ ๋“ฑ๋ก ๊ตฌํ˜„์œผ๋กœ ์ด๋ฏธ ๊ธฐ๋ฐ˜์ด ์žกํ˜€ ์žˆ์œผ๋ฏ€๋กœ POJO ๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ  @SpringBootTest ๋กœ ์‹œ์ž‘

์ƒํ’ˆ ์กฐํšŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

์ƒํ’ˆ ์กฐํšŒ ๊ธฐ๋Šฅ API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜

์ƒํ’ˆ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

POJO

์ƒํ’ˆ ๋“ฑ๋ก๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰.

(1) ํ•„์š”ํ•œ ์„œ๋น„์Šค ํ˜ธ์ถœ

productService.updateProduct(productId, request);

(2) ์„œ๋น„์Šค ํ˜ธ์ถœ์— ํ•„์š”ํ•œ Request record ํด๋ž˜์Šค ์ƒ์„ฑ

  • Assert ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒ€์ฆ

final UpdateProductRequest request = new UpdateProductRequest(name, price, discountPolicy);

(3) ์„œ๋น„์Šค์— ์ƒํ’ˆ ์ˆ˜์ • ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

(4) ์ƒํ’ˆ ์ˆ˜์ •์„ ์œ„ํ•œ ๋„๋ฉ”์ธ ๋ฉ”์„œ๋“œ๋Š” ํ…Œ์ŠคํŠธ ํ•„์ˆ˜

  • Product.update

(4) StubClass ๋˜๋Š” Mockito ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ

์ƒํ’ˆ ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ Stub ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ

Use Mockito instead of StubClass

์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

POJO Test to SpringBoot Test

API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

์ƒํ’ˆ ์ฃผ๋ฌธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

POJO

POJO ์ƒํ’ˆ ์ฃผ๋ฌธ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

Move Inner class for test to Upper leve

์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

JPA ์ ์šฉ

JPA ์ ์šฉํ•˜๊ธฐ

์ฃผ๋ฌธ ๊ฒฐ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

POJO

POJO ์ฃผ๋ฌธ ๊ฒฐ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

์Šคํ”„๋ง๋ถ€ํŠธ ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

API ํ…Œ์ŠคํŠธ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

JPA ์ ์šฉ

JPA ์ ์šฉํ•˜๊ธฐ

์ƒ์„ธ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

์ƒ์„ธ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

Point.

  • final keyword

  • record class

  • Assert in constructor

  • rest-assured api test

  • var type

  • HttpStatus

    • 200 OK

    • 201 CREATE

Last updated