작성
·
3.5K
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
3
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()를 사용해 보세요.
정해진 답이 있는게 아니라, 해당 메소드에 어떤 일을 하고 어떤 결과를 주길 바라느냐에 따라 달리겠지요. 결과로 Boolean을 돌려줘야하는 오퍼레이션인지, 도메인을 리턴해야하는지는 그 메소드를 사용하는 곳에서 boolean만 받아도 괜찮은지, 아니면 도메인을 받아서 쓰길 원하는지 봐야하지 않을까요.
아아,, 단순히 메서드 반환값을 받는 곳에서는 Boolean 만 받아도 된다고 판단했는데, 강의를 듣고 테스트 코드를 짜보는 과정을 통해 조금 테스트에 대한 장점이 퇴색(?)되는 느낌이 들어서 여쭤봤었습니다!
이런 부분은 꼭 테스트에 얽메이지 않고, 말씀하신대로 메서드를 사용하는 곳에서 결정하면 되겠네요 ㅎㅎ
추가적인 답변 감사드립니다 :)
오 그렇군요 답변 정말 감사드립니다! 혹시 질문 내용 후반에 있는 추가적인 질문에도 의견 주실 수 있으실까요?
```
추가적인 질문으로, 테스트하려는 `createChatRoom()` 메서드는 보시는 바와 같이 `chatRoom`을 생성하고, `Boolean` 값을 리턴합니다. 하지만 테스트 코드의 경우 대부분 리턴값이나 발생하는 예외클래스에 의존하기에, 보통 서비스 레이어의 메서드에서 이러한 `Boolean` 값은 의미가 덜하다는 느낌을 받았습니다.
서비스 레이어의 메서드에서는 보통 특정 도메인에 관련된 객체나 컬렉션 등을 반환하는게 더 좋은 코드일까요?
```