inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Practical Testing: 실용적인 테스트 가이드

@Mock, @Spy, @InjectMocks

Mockito활용시 void타입의 메소드는 어떻게 해야하나욤?

390

세진:)

작성한 질문수 19

0

 

안녕하세요! 너무 좋은 강의 올려주셔서 감사합니다

덕분에 엄청엄청 많이 도움받았습니다.

궁금한점이 void타입의 검증메소드의 경우 mockito를 사용할때 reason: no instance(s) of type variable(s) T exist so that void conforms to T 라는 컴파일 에러가 나는데, wilThrow는 해야하거든요!

이런 void타입의 경우는 어떻게 테스트하는지 궁금합니다!


추가적으로 서비스 레이어를 sut으로 작성했지만 void타입일 경우 어떤 데이터를 검증해야하는지 궁금합니당.. 만약 마지막 흐름이 특정 레포지토리라면 해당 레포지토리가 호출되었는지 행위검증만하는 verfiy만 사용하면 될까요?

spring tdd jpa mockito 소프트웨어-테스트 junit5

답변 2

0

박우빈

안녕하세요, 세진:) 님!

질문하신 내용에 대한 방법적인 부분은 아래 인프런 AI 인턴이 설명을 잘 해준 것 같아요 ㅎㅎ

저는 그래서 다른 측면에서 이야기 해보려고 하는데, 일단 void 타입의 메서드는 반환 타입이 존재하는 메서드보다 테스트하기가 어려운 것이 사실입니다.
수행에 대한 결과가 반환되지 않기 때문에, 내부 로직의 정상 작동 여부를 보다 확인하기가 어렵기 때문이죠.

그렇기에 설계 시에 void 타입을 피하고 명확한 반환타입을 제공할 수 있는 선택지가 존재한다면, 그 방안을 택하는 것이 좋습니다.
고민을 했음에도 void 타입이 더 적절한 것 같다면, 그 때 검증을 할 수 있는 verify 등의 방법을 사용해서 검증해주시면 됩니다.

통합 테스트라면 void 타입 메서드가 조작한 데이터 등을 DB에서 직접 조회해서 검증하는 방안도 있겠네요.

감사합니다 🙂

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

Mockito를 사용해서 void 타입의 메소드를 테스트할 때는 doThrow()를 사용할 수 있습니다. 이 방법을 사용하면 void 타입의 메소드가 호출됐을 때 예외를 발생시키도록 설정할 수 있습니다. 예를 들어, 특정 메소드가 호출되었을 때 NullPointerException을 발생시키고 싶다면 아래와 같이 작성할 수 있습니다.

doThrow(new NullPointerException()).when(mockObject).methodName();

이렇게 설정하고 나서 해당 메소드가 호출되었을 때 정말로 원하는 예외가 발생하는지 검증하면 됩니다.

서비스 레이어에서 void 타입 메소드의 동작을 검증하기 위해서는, 실제로 데이터를 검증하는 것이 아니라 해당 메소드의 부수 효과를 검증해야 합니다. 예를 들어, 메소드가 특정 로직을 수행한 후 내부적으로 특정 레포지토리의 메소드를 호출한다고 하면, verify()를 사용해서 해당 레포지토리 메소드가 실제로 호출되었는지를 검증할 수 있습니다. 이 방법을 통해 메소드가 올바르게 작동했는지 간접적으로 확인할 수 있습니다.

예를 들어, myRepository.save() 메소드가 호출되어야 한다면, 다음과 같이 작성할 수 있습니다.

verify(myRepository, times(1)).save(any());

이 코드는 myRepository.save()가 한 번 호출되었는지를 검증합니다. 만약 호출되지 않았거나 여러 번 호출되었다면 테스트는 실패할 것입니다.

데이터 검증이 아닌 행위 검증에 초점을 맞춰서 테스트를 진행하시면 됩니다.

private 상수 테스트 관련 질문

0

82

1

void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??

0

124

2

커버리지는 어떻게 활용하시는지 궁금합니다.

0

159

2

테스트 문서화 질문입니다

0

104

2

단위테스트 질문이 있습니다

0

95

2

컨트롤러는 모킹을 한 이유가 궁금합니다.

0

100

2

ERD 가장자리에 있는 도메인 테스트 질문

0

87

2

DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?

0

133

2

OrderCreateRequest DTO에 대해서 궁금한점

0

101

2

고전파의 테스트 대역 사용 대상, 공유 의존성

0

154

2

계층 관련 질문이 있습니다.

0

137

3

'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다

1

122

2

혹시 update 로직은 어떻게 테스트하나요? (@Setter?)

0

133

2

단위테스트와 통합테스트의 경계가 궁금합니다.

0

228

2

Service+Repository 통합테스트 관련 질문입니다.

0

149

2

OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요

0

183

2

test 용 .yml

0

89

2

throws Exception

0

78

2

카페키오스크 클래스 문의 ,,

0

87

2

Rest docs 문서용 테스트코드를 따로 작성해야 되나요?

0

172

2

테스트 코드에서 필요한 생성자

0

137

1

tearDown 순서

0

115

2

@Builder 생성자 private

0

135

2

@DisplayName gradle / intellJ

0

92

2