작성
·
204
·
수정됨
0
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!
먼저 유사한 질문이 있었는지 검색해 보세요.
서로 예의를 지키며 존중하는 문화를 만들어가요.
안녕하세요! 너무 좋은 강의 올려주셔서 감사합니다
덕분에 엄청엄청 많이 도움받았습니다.
궁금한점이 void타입의 검증메소드의 경우 mockito를 사용할때 reason: no instance(s) of type variable(s) T exist so that void conforms to T
라는 컴파일 에러가 나는데, wilThrow는 해야하거든요!
이런 void타입의 경우는 어떻게 테스트하는지 궁금합니다!
추가적으로 서비스 레이어를 sut으로 작성했지만 void타입일 경우 어떤 데이터를 검증해야하는지 궁금합니당.. 만약 마지막 흐름이 특정 레포지토리라면 해당 레포지토리가 호출되었는지 행위검증만하는 verfiy만 사용하면 될까요?
답변 2
0
안녕하세요, 세진:) 님!
질문하신 내용에 대한 방법적인 부분은 아래 인프런 AI 인턴이 설명을 잘 해준 것 같아요 ㅎㅎ
저는 그래서 다른 측면에서 이야기 해보려고 하는데, 일단 void 타입의 메서드는 반환 타입이 존재하는 메서드보다 테스트하기가 어려운 것이 사실입니다.
수행에 대한 결과가 반환되지 않기 때문에, 내부 로직의 정상 작동 여부를 보다 확인하기가 어렵기 때문이죠.
그렇기에 설계 시에 void 타입을 피하고 명확한 반환타입을 제공할 수 있는 선택지가 존재한다면, 그 방안을 택하는 것이 좋습니다.
고민을 했음에도 void 타입이 더 적절한 것 같다면, 그 때 검증을 할 수 있는 verify 등의 방법을 사용해서 검증해주시면 됩니다.
통합 테스트라면 void 타입 메서드가 조작한 데이터 등을 DB에서 직접 조회해서 검증하는 방안도 있겠네요.
감사합니다 🙂
0
안녕하세요, 인프런 AI 인턴입니다.
Mockito를 사용해서 void 타입의 메소드를 테스트할 때는 doThrow()
를 사용할 수 있습니다. 이 방법을 사용하면 void 타입의 메소드가 호출됐을 때 예외를 발생시키도록 설정할 수 있습니다. 예를 들어, 특정 메소드가 호출되었을 때 NullPointerException
을 발생시키고 싶다면 아래와 같이 작성할 수 있습니다.
doThrow(new NullPointerException()).when(mockObject).methodName();
이렇게 설정하고 나서 해당 메소드가 호출되었을 때 정말로 원하는 예외가 발생하는지 검증하면 됩니다.
서비스 레이어에서 void 타입 메소드의 동작을 검증하기 위해서는, 실제로 데이터를 검증하는 것이 아니라 해당 메소드의 부수 효과를 검증해야 합니다. 예를 들어, 메소드가 특정 로직을 수행한 후 내부적으로 특정 레포지토리의 메소드를 호출한다고 하면, verify()
를 사용해서 해당 레포지토리 메소드가 실제로 호출되었는지를 검증할 수 있습니다. 이 방법을 통해 메소드가 올바르게 작동했는지 간접적으로 확인할 수 있습니다.
예를 들어, myRepository.save()
메소드가 호출되어야 한다면, 다음과 같이 작성할 수 있습니다.
verify(myRepository, times(1)).save(any());
이 코드는 myRepository.save()
가 한 번 호출되었는지를 검증합니다. 만약 호출되지 않았거나 여러 번 호출되었다면 테스트는 실패할 것입니다.
데이터 검증이 아닌 행위 검증에 초점을 맞춰서 테스트를 진행하시면 됩니다.