• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

Mock에 Stubbing 중 발생하는 에러

22.02.11 22:32 작성 조회수 2.56k

0

안녕하세요 백기선님, 강의 재밌게 잘 듣고 있습니다!

강의를 듣고 개인 프로젝트를 공부하는 도중 적용하다가 문제가 발생했는데, 이유를 여쭙고 싶어서 이렇게 질문을 남기게 되었습니다.

<테스트하려는 메서드>

 

<테스트 메서드>

 

<ChatRoom 엔티티>

 

 

<에러 내용 중 일부>

``` shell

Strict stubbing argument mismatch. Please check:

 - this invocation of 'save' method:

    chatRoomRepository.save(

    com.example.practice.chatRoom.ChatRoom@252f626c

);

    -> at com.example.practice.chatRoom.ChatRoomService.createChatRoom(ChatRoomService.java:39)

 - has following stubbing(s) with different arguments:

    1. chatRoomRepository.save(

    com.example.practice.chatRoom.ChatRoom@20e6c4dc

);

```

 

위와 같이, ChatRoomRepository(JpaRepository 상속)의 save() 메서드를 Stubbing 하는 과정에서 문제가 발생했습니다.

테스트하려는 메서드(createChatRoom(Member loginMember, ChatRoomRequest chatRoomRequest)))  내부에서 chatRoomRepository.save() 메서드에 매개변수로 생성자를 바로 넣어줘서 그런걸까요?

원인을 잘 모르겠습니다.. 😭

 

추가적인 질문으로, 테스트하려는 `createChatRoom()` 메서드는 보시는 바와 같이 `chatRoom`을 생성하고, `Boolean` 값을 리턴합니다. 하지만 테스트 코드의 경우 대부분 리턴값이나 발생하는 예외클래스에 의존하기에, 보통 서비스 레이어의 메서드에서 이러한 `Boolean` 값은 의미가 덜하다는 느낌을 받았습니다.

서비스 레이어의 메서드에서는 보통 특정 도메인에 관련된 객체나 컬렉션 등을 반환하는게 더 좋은 코드일까요?

 

질문 읽어주셔서 감사합니다. 좋은 주말 되세요 :)

 

 

 

답변 1

답변을 작성해보세요.

2

Strict stubbing argument mismatch. Please check:

 - this invocation of 'save' method:

    chatRoomRepository.save(

    com.example.practice.chatRoom.ChatRoom@252f626c

);

이 메시지가 핵심입니다. 메시지의 뜻은 아규먼트가 일치하지 않는다는 것입니다. 목킹할 때 save에 넘겨준 아규먼트와 실제로 save를 호출하면서 넘겨준 chatroom이 일치하지 않는 것이죠. 의심하고 계신대로, 소스 코드에서는 new를 사용해서 새로운 인스턴스를 만들었기 때문에, 목킹할 때 사용한 아규먼트와 일치하지 않아서 발생할 에러입니다.

어떤 타입의 ChatRoom 인스턴스를 받는지 상관없이 내가 미리 만들어둔 chatRoom을 리턴하게 목킹하고 싶다면 any()를 사용해 보세요.

kwpark96님의 프로필

kwpark96

질문자

2022.02.15

오 그렇군요 답변 정말 감사드립니다! 혹시 질문 내용 후반에 있는 추가적인 질문에도 의견 주실 수 있으실까요?


```

추가적인 질문으로, 테스트하려는 `createChatRoom()` 메서드는 보시는 바와 같이 `chatRoom`을 생성하고, `Boolean` 값을 리턴합니다. 하지만 테스트 코드의 경우 대부분 리턴값이나 발생하는 예외클래스에 의존하기에, 보통 서비스 레이어의 메서드에서 이러한 `Boolean` 값은 의미가 덜하다는 느낌을 받았습니다.

서비스 레이어의 메서드에서는 보통 특정 도메인에 관련된 객체나 컬렉션 등을 반환하는게 더 좋은 코드일까요?

```

정해진 답이 있는게 아니라, 해당 메소드에 어떤 일을 하고 어떤 결과를 주길 바라느냐에 따라 달리겠지요. 결과로 Boolean을 돌려줘야하는 오퍼레이션인지, 도메인을 리턴해야하는지는 그 메소드를 사용하는 곳에서 boolean만 받아도 괜찮은지, 아니면 도메인을 받아서 쓰길 원하는지 봐야하지 않을까요.

kwpark96님의 프로필

kwpark96

질문자

2022.02.16

아아,, 단순히 메서드 반환값을 받는 곳에서는 Boolean 만 받아도 된다고 판단했는데, 강의를 듣고 테스트 코드를 짜보는 과정을 통해 조금 테스트에 대한 장점이 퇴색(?)되는 느낌이 들어서 여쭤봤었습니다!

이런 부분은 꼭 테스트에 얽메이지 않고, 말씀하신대로 메서드를 사용하는 곳에서 결정하면 되겠네요 ㅎㅎ

추가적인 답변 감사드립니다 :)