728x90
문제
org.mockito.exceptions.base.MockitoException:
Cannot mock/spy class net.nurigo.sdk.message.service.DefaultMessageService
Mockito cannot mock/spy because :
- final class
@Mock을 사용해서 mocking을 하려고 했는데 해당 클래스가 final 클래스여서 mocking이 불가능한 상태였다.
해결하기
What's new in Mockito 2
Most popular Mocking framework for unit tests written in Java - mockito/mockito
github.com
위의 Mockito2를 사용하면 이를 해결할 수 있다.
여기서 sample도 참고할 수 있다.
1. 의존성 추가
https://github.com/mockito/mockito/wiki/Declaring-mockito-dependency
Declaring mockito dependency
Most popular Mocking framework for unit tests written in Java - mockito/mockito
github.com
dependencies { testImplementation "org.mockito:mockito-core:1.+" }
2. 설정파일 추가
src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
mock-maker-inline
3. Mock으로 만들기
문제가 되는 final 클래스
final class FinalClass {
final String finalMethod() { return "something"; }
}
mock으로 생성
FinalClass mock = mock(FinalClass.class);
4. 테스트 코드 작성
FinalClass concrete = new FinalClass();
FinalClass mock = mock(FinalClass.class);
given(mock.finalMethod()).willReturn("not anymore");
assertThat(mock.finalMethod()).isNotEqualTo(concrete.finalMethod());
아래는 실제 내가 작성한 테스트 코드다.
@ExtendWith(MockitoExtension.class)
@WithMockCustomUser
class AuthSmsServiceTest {
@Mock
private RedisStringService redisService;
@Mock
private MemberRepository memberRepository;
// 문제가 되었던 final 클래스
DefaultMessageService messageService = mock(DefaultMessageService.class);
@InjectMocks
private AuthSmsService authSmsService;
@Test
@DisplayName("휴대폰 인증번호 메시지 전송 - 성공")
void sendAuthSms() {
// Given
String groupId = "groupId";
String to = "01077777777";
String from = "01011111111";
MessageType type = MessageType.SMS;
String statusMessage = "message";
String country = "korea";
String messageId = "id";
String statusCode = "statusCode";
String accountId = "accoutId";
SendAuthSmsRequestDto requestDto = new SendAuthSmsRequestDto(to);
SendAuthSmsRequestDto dto = new SendAuthSmsRequestDto(to);
given(messageService.sendOne(dto.toMessage("인증 : %s",from,"123456")))
.willReturn(new SingleMessageSentResponse(groupId,to, from, type, statusMessage, country, messageId, statusCode, accountId));
SendAuthSmsResponseDto responseDto = authSmsService.sendAuthSms(requestDto);
// Then
assertEquals(60, responseDto.expirationSeconds());
}
}
728x90
'spring > test' 카테고리의 다른 글
| [Test] 테스트 코드가 필요한 이유 (0) | 2024.06.05 |
|---|