인프런 커뮤니티 질문&답변

just kim님의 프로필 이미지

작성한 질문수

입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기

[실습] 서비스 테스트 코드 작성

테스트 코드에서 JpaRepository.save 가 안되는데 문제가 뭔지 모르겠어요.

해결된 질문

작성

·

150

1

안녕하세요. 몇달간 넘 바빠서 스프링 공부를 못했네요.

프로젝트를 하나 새롭게 생성한다음에 첨부터 강의 하나 하나 보면서 프로젝트에 기능을 추가 하고 있었습니다.

그리고 Repository와 Service를 까지 왔어요..

이 둘의 차이점도 확인해서 비교 하고

 

그런데 역시 의존성 주입은 좀 어렵더라구요.. 아마 이부분을 제가 몰라서 아래 설명할 코드에 예상하지 못하는 결과가 나왔을꺼 같은데 흠... 사실 질문 하기 미안 하긴 하지만 그래도 빨리 좀 알아야해서 질문 드립니다.

 

일단 깃 주소부터 올립니다.

justkjy/about-coffee: about coffee server (github.com)

https://github.com/justkjy/about-coffee

여기에 test>kotlin>... >service>PresentationServiceTest>

fun insertMenuTest() {

...............

val testCoffeeMenu = presentationService.coffeeMenuSave(coffeeMenuDto)

...............

}

디버깅 타서

src/main/kotlin/com/example/aboutcoffee/service/PresentationService.kt

 

fun coffeeMenuSave(menuDTO: CoffeeMenuDTO):CoffeeMenu? {
.................

resultMenu = presentationRepository.coffeeMenuSave(menuSave)
................
}

이 부분 왜 null을 리턴하는지 모르겠어요...

분명 데이터 저장하는게 맞는데 ....

mock 설정이 잘못되서 그런거겠죠??

ㅠ.ㅠ 에러를 못잡아서 잠을 못자고 있네요

이 프로젝트 완료하면 react로 작성된 커피 블러그랑 연동 하려 했는데 ... 시간이 꽤 걸릴듯 하네요 ㅠ.ㅠ

 

 

 

답변 2

0

정보근님의 프로필 이미지
정보근
지식공유자

리포지토리의 PresentationServiceTest 코드 확인해보았는데요.

 

먼저 말씀드린 것처럼 presentationRepository.coffeeMenuSave(menuSave)의 행동이 정의되어있지 않았었네요.

 

@InjectMocks
lateinit var presentationService: PresentationService

@Mock
lateinit var presentationRepository: PresentationRepository

이 부분 설명을 드리면, PresentationRepository의 모양만 갖춘 빈 껍데기를 만들어서

PresentationService에 주입한다고 할 수 있습니다.

 

그럼 PresentationRepository는 말 그대로 빈 껍데기이기 때문에 실제로 동작을 하지 않고,

이게 주어진 상황에서 어떻게 동작을 할지를 개발자가 정의를 해줘야 합니다.

그게 단위 테스트의 목적이기도 하고요.

다른 모든 조건을 통제한 상태에서 개발자가 테스트 하고 싶은 부분만을 테스트 하기 위해 모킹을 하는 것입니다.

 

Mockito.when(presentationRepository.coffeeMenuSave(any()))
.thenReturn(new CoffeeMenu())

위의 코드를 추가하시면 아마 presentationRepository에서 새롭게 생성된 CoffeeMenu를 리턴할겁니다.

코드 설명을 드리면, presentationRepository.coffeeMenuSave()를 호출할 때,

이 때 파라미터는 any(), 즉 인자로 어떤 게 들어오던간에

new CoffeeMenu()를 리턴한다고 PresentationRepository 껍데기에다가 행동을 지정해주는겁니다.

 

감사합니다.

0

정보근님의 프로필 이미지
정보근
지식공유자

안녕하세요 정보근입니다:)

 

보내주신 레포지토리가 프라이빗인지 접속이 되지 않네요.

 

 

일단 올려주신 내용만 봤을 때 정확한 원인 파악은 어렵지만

추정하면 presentationRepository.coffeeMenuSave(menuSave)의 모킹이 잘못되지 않았을까 싶네요.

 

Mockito.when(presentationRepository.coffeeMenuSave(any())).thenReturn(new CoffeeMenu)와 같이 해당 메소드가 특정 결과를 리턴하도록 모킹해주셨는지 확인해보시면 좋을 것 같습니다.

 

리포지토리 퍼블릭으로 바꿔주시거나, 좀 더 자세한 코드 올려주시면 다시 확인해보겠습니다.

 

감사합니다.

just kim님의 프로필 이미지
just kim
질문자

감사합니다.

git은 public으로 수정 하였습니다.

감사합니다. ^^

just kim님의 프로필 이미지

작성한 질문수

질문하기