λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

SpringπŸƒ

ν…ŒμŠ€νŠΈ μ½”λ“œ(2)

728x90

좜처 : 내일배움캠프

 

μœ λ‹›(λ‹¨μœ„) ν…ŒμŠ€νŠΈ : λ©”μ„œλ“œ λ‹¨μœ„λ‘œ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰

톡합 ν…ŒμŠ€νŠΈ : μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 전체 λ™μž‘μ΄ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ μˆ˜ν–‰

 

F.I.R.S.T 원칙

  • Fast : λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” λΉ¨λΌμ•Ό ν•œλ‹€.
  • Independent : λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” 각각의 ν…ŒμŠ€νŠΈκ°€ μ—°κ΄€λ˜μ§€ μ•Šκ³ , κ³ λ¦½λ˜μ–΄μ•Ό ν•œλ‹€. 즉 λ…립적 이어야 ν•œλ‹€.
  • Repeatable : λ‹¨μœ„ν…ŒμŠ€νŠΈλŠ” λ°˜λ³΅ κ°€λŠ₯ν•΄μ•Όν•œλ‹€. 반볡적으둜 ν…ŒμŠ€νŠΈλ₯Ό μ‹œν–‰ν•΄λ„, κ²°κ³ΌλŠ” κ°™μ•„μ•Ό ν•œλ‹€.
  • Self-validating : 자체적으둜 ν…ŒμŠ€νŠΈ κ²°κ³Όκ°€ λ„μΆœλ˜μ•Όν•œλ‹€. (κ°œλ°œμžκ°€ print μ°μ–΄μ„œ λΉ„κ΅ν•˜λŠ”κ²Œ μ•„λ‹ˆκ³  μžλ™μœΌλ‘œ μˆ˜ν–‰λ˜λ©° 성곡/μ‹€νŒ¨ 의 κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” 것)
  • Timely : λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” μ‹€μ œ μ½”λ“œλ³΄λ‹€ λ¨Όμ € κ΅¬ν˜„ν•΄μ•Όν•œλ‹€. (TDD일 κ²½μš°μ—λ§Œ ν•΄λ‹Ή)

Given-When-Then νŒ¨ν„΄

  • Given : ν…ŒμŠ€νŠΈμ— ν•„μš”ν•œ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜κ±°λ‚˜ Mock 객체λ₯Ό 톡해 νŠΉμ • 상황에 λŒ€ν•œ 행동을 μ •μ˜
  • When: μ‹€μ œ ν…ŒμŠ€νŠΈλ₯Ό ν•˜λŠ” λ©”μ†Œλ“œκ°€ 호좜되며 ν…ŒμŠ€νŠΈλ₯Ό ν†΅ν•œ 결과값을 κ°€μ Έμ˜¨λ‹€.
  • Then: When λ‹¨κ³„μ—μ„œ λ‚˜μ˜¨ 결과값을 κ²€μ¦ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰

Junit + Mockito

Junit : μžλ°”μ˜ ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬

Mockito : Mock 객체 생성, 관리, 검증 ν”„λ ˆμž„μ›Œν¬

~ κ°€μ§œ 객체의 μ˜μ‘΄μ„± μ£Όμž…μ„ μœ„ν•΄ ν•„μš”ν•œ μ–΄λ…Έν…Œμ΄μ…˜

@Mock : Mock 객체 생성 및 λ°˜ν™˜ μ–΄λ…Έν…Œμ΄μ…˜

@Spy : Stubν•˜μ§€ μ•Šμ€ λ©”μ†Œλ“œ(κ°€μ§œ λ©”μ†Œλ“œκ°€ μ•„λ‹Œ)λŠ” 원본 λ©”μ†Œλ“œ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜

@InjectMocks : @Mock λ˜λŠ” @Spy둜 μƒμ„±λœ κ°€μ§œ 객체 μžλ™ μ£Όμž… μ–΄λ…Έν…Œμ΄μ…˜

 

ex) UserController λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό 진행할 λ•Œ, @Mock μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 κ°€μ§œ UserServiceλ₯Ό λ§Œλ“€κ³ , @InjectMocksλ₯Ό 톡해 UserController에 이λ₯Ό μ£Όμž…ν•  수 μžˆλ‹€

 

@ExtendWith(MockitoExtension.class) : Junitκ³Ό Mockitoλ₯Ό μ—°κ²°μ‹œμΌœμ£ΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜

@DisplayName(" ") : ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ 라벨링 μ–΄λ…Έν…Œμ΄μ…˜

 

Junit의 생λͺ…μ£ΌκΈ°

ν…ŒμŠ€νŠΈ μˆœμ„œμ— κ΄€μ—¬ν•˜κ²Œ λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜

@BeforeAll : ν…ŒμŠ€νŠΈ μ‹œμž‘ μ „ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œ

@BeforeEach : 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ‹€ν–‰ μ „ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œ

@AfterAll : ν…ŒμŠ€νŠΈ μ’…λ£Œ μ‹œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œ

@AfterEach : 각 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ μ’…λ£Œ μ‹œ ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œ

 

μˆ˜μ—… 포인트

-> λ©”μ„œλ“œ λ‚΄ 쒅속성 κ°μ²΄λŠ” Mockingν•΄ κ°€μ§œ 객체λ₯Ό λ§Œλ“€κ³  ν•΄λ‹Ή λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 μ •μƒμ μœΌλ‘œ μž‘λ™ν•˜λŠ” κ²ƒλ§Œμ„ λ³΄λŠ” 것이닀.

ex) μ„œλΉ„μŠ€ λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό 진행할 λ•Œ, DB 검색 등은 μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€

-> λ°˜ν™˜ 값이 μ—†λŠ” λ©”μ„œλ“œλŠ” μˆ˜ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

-> Then λ‹¨κ³„μ—μ„œλŠ” 주둜 assert 문을 μ‚¬μš©ν•œλ‹€.

-> HttpServletResponse도 ν•΄λ‹Ήν•˜λŠ” Mock 객체(MockHttpServletResponse νƒ€μž…)λ₯Ό 생성해 인자 κ°’μœΌλ‘œ ν™œμš©ν•˜λ©΄ λœλ‹€

 

01.30

ν…ŒμŠ€νŠΈ 클래슀 생성 - μ„œλ²„ ꡬ동방법 선택(@ExtendWtih λ“±) - ν•„λ“œ 생성 + Mocking - λ©”μ„œλ“œ μž‘μ„± (when - given - then)- ν…ŒμŠ€νŠΈ

 

κ°•μ˜μ—μ„œ μ‚¬μš©ν•œ MockMvcBuilders 클래슀

https://donghyeon.dev/spring/2019/03/28/Spring-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC-%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EC%9C%84%ED%95%9C-MockMvc/

μ €λ²ˆ μ‹€μŠ΅ λ•Œ λ³Έ @SpringBootTest + MockMvc + @TestConstructor

https://gaemi606.tistory.com/entry/JUnit-5-ExtendWith-MockMvc-TestConstructor

* 컨트둀러 λ ˆμ΄μ–΄μ— λŒ€ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” κ·Έ 둜직이 λ³΅μž‘ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈ ν•„μš”μ„±μ΄ λ‹€λ₯Έ ν…ŒμŠ€νŠΈμ— λΉ„ν•΄ 크지 μ•Šμ•„ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±μ˜ ν•„μš”μ„±μ΄ 떨어진닀 & λ‹€λ₯Έ ν”„λ‘œμ νŠΈμ˜ 컨트둀러 ν…ŒμŠ€νŠΈ μ½”λ“œμ™€ μœ μ‚¬ν•œ 점이 λ§Žλ‹€

~ ν†΅ν•©ν…ŒμŠ€νŠΈ, ν¬μŠ€νŠΈλ§¨μ„ ν†΅ν•œ ν…ŒμŠ€νŠΈκ°€ 보닀 λ°”λžŒμ§ν•˜λ‹€

 

λ ˆν¬μ§€ν† λ¦¬ ν…ŒμŠ€νŠΈ : κΈ°λ³Έ λ©”μ„œλ“œλŠ” 이미 μ™„μ„±λ˜μ–΄ 제곡되기 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈν•  ν•„μš” μ—†λ‹€

Mocking ν•  ν•„μš” μ—†λ‹€

 

728x90