๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Spring] Spock ๋ณธ๋ฌธ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ค‘์š”์„ฑ

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ถˆํ™•์‹ค์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ๊ธฐ๋Šฅ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธํ•ด์ค€๋‹ค.
    • ex) A๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€๋กœ ๊ฐœ๋ฐœํ•˜์—ฌ ์˜คํ”ˆํ–ˆ๋”๋‹ˆ ๊ธฐ์กด์— ์ž˜ ์‚ฌ์šฉํ•˜๋˜ B๋ผ๋Š” ๊ธฐ๋Šฅ์ด ๋ฌธ์ œ ๋ฐœ์ƒ
  •  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„ ์ดˆ๊ธฐ์— ๋ฌธ์ œ ๋ฐœ๊ฒฌ์— ๋„์›€์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ๋‹จ์ถ•!
    • ex) ์ถฉ๋ถ„ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์—†์ด ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌ -> ๋ฐฐํฌ ํ›„ ๋ฌธ์ œ ๋ฐœ์ƒ -> ์›์ธ ํŒŒ์•…, ๋‹ค์‹œ ํ…Œ์ŠคํŠธ ๋ฐ ์ฝ”๋“œ ์ˆ˜์ • -> ์•ผ๊ทผ..

 

Spock ํ”„๋ ˆ์ž„์›Œํฌ

  • BDD(Behaviour-Driven Development) ํ”„๋ ˆ์ž„์›Œํฌ
  • ๊ธฐ๋Œ€ํ•˜๋Š” ๋™์ž‘๊ณผ ํ…Œ์ŠคํŠธ์˜ ์˜๋„๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚ด์ฃผ๊ณ  ์‚ฐ๋งŒํ•œ ์ฝ”๋“œ๋Š” ๋’ค๋กœ ์ˆจ๊ฒจ์ฃผ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
  • Groovy ์–ธ์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋ฉฐ JUnit ๊ณผ ๋น„๊ตํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • Groovy ์–ธ์–ด๋Š” ๋™์  ํƒ€์ž… ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ JVM ์œ„์—์„œ ๋™์ž‘ํ•˜๋ฉฐ Java๋ฌธ๋ฒ•๊ณผ ์œ ์‚ฌ
  • ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์„ ๋ฌธ์ž์—ด๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ given, when, then ์ฝ”๋“œ ๋ธ”๋ก์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„
  • Junit์˜ ๊ฒฝ์šฐ ์ฃผ์„์œผ๋กœ ๋ธ”๋ก์„ ๊ตฌ๋ถ„ํ–ˆ์—ˆ๊ณ , ๋ฉ”์†Œ๋“œ ์ด๋ฆ„ ๋˜ํ•œ ์ œ์•ฝ์‚ฌํ•ญ์ด ๋งŽ์ด ์กด์žฌ

 

 

Spock ํ”„๋ ˆ์ž„์›Œํฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์ˆœ์„œ

  • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋Š” Groovy ํด๋ž˜์Šค๋กœ ์ƒ์„ฑํ•˜๊ณ , Specification ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๋Š”๋‹ค.
  • feature(ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋Š”) def๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋กœ ์„ ์–ธํ•˜๋ฉฐ, ํ•˜๋‚˜ ์ด์ƒ ๋ธ”๋ก์ด ์กด์žฌํ•ด์•ผ ํ•จ
  • given ๋ธ”๋ก : ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๊ฐ’์„ ์ค€๋น„ํ•œ๋‹ค.
  • when ๋ธ”๋ก : ํ…Œ์ŠคํŠธํ•  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • then ๋ธ”๋ก : when๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉฐ ์˜ˆ์™ธ ๋ฐ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฒ€์ฆํ•œ๋‹ค.
  • expect ๋ธ”๋ก : then๊ณผ ๊ฐ™์œผ๋ฉฐ when์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ๋ฐ where์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • where ๋ธ”๋ก : ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅด๊ณ  ๋กœ์ง์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ ๊ฐ€๋Šฅ

 

 

Spock ํ”„๋ ˆ์ž„์›Œํฌ ์ฃผ์š” ๊ธฐ๋Šฅ

  • JUnit์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ์š”์†Œ๋“ค์€ ๋ชจ๋‘ Spock์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

 

 

Spock ํ”„๋ ˆ์ž„์›Œํฌ ์„ค์ •

1. Spock ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด IDE Spock ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ฐ ์˜์กด์„ฑ ์ถ”๊ฐ€

2. groovy ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ๋ฐ spock ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ƒ์„ฑ

 

 

Spock ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•œ Spock ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

  • Specification: extends ํ•˜๋ฉด Spock Test ํด๋ž˜์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • def : groovy์˜ ๋™์  ํƒ€์ž… ์„ ์–ธ(๋ฉ”์†Œ๋“œ, ๋ณ€์ˆ˜์— ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. JS์˜ var ๊ฐ™์€ ์กด์žฌ)
    • def ๋Œ€์‹ ์— Java์ฒ˜๋Ÿผ ์‹ค์ œ ํด๋ž˜์Šค ํƒ€์ž…์„ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • setup  : ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์‹คํ–‰ ์ „ ๋งˆ๋‹ค ์‹คํ–‰
  • given, when, then: Spock feature ๋ฉ”์†Œ๋“œ

 

 

Mock ํ…Œ์ŠคํŠธ

Spock์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ ์ค‘ ๋˜ ํ•˜๋‚˜๋Š” Mock ์ด๋‹ค.

def mockService = Mock(CustomerService) CustomerService mockService = Mock()

Spock์—์„œ Mock ๊ฐ์ฒด์˜ ๋ฐ˜ํ™˜๊ฐ’์€ >> ๋กœ ์ง€์ •ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜์ ์ธ ๊ฐ’์˜ ๋ฐ˜ํ™˜์„ Mocking ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

customerRepository.findName(1) >> "jojoldu"

๋งŒ์•ฝ Exception์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค๋ฉด

customerService.validate() >> { throw new ResourceNotFoundException}

์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์˜ˆ์ œ ์ฝ”๋“œ

 

 

 

 

 

์ถœ์ฒ˜

https://jojoldu.tistory.com/228