본문 바로가기
에러 해결

💥 org.mockito.exceptions.misusing.PotentialStubbingProblem: Strict stubbing argument mismatch.

by sangyunpark99 2024. 7. 17.

ServiceTest코드를 작성한 후, 테스트를 수행하는 도중에 다음과 같은 에러가 발생했다.

 

코드의 오류 메시지는 다음과 같다.

Strict stubbing argument mismatch. Please check:
- this invocation of 'save' method : transferHistoryRepository.save(...);

 

💻 메시지의 뜻은 아규먼트가 일치하지 않는다는 것이다. 목킹할 때 save에 넘겨준 아규먼트와 실제로 save를 호출하면서 넘겨준 transferHistory이 일치하지 않으면서 발생하는 에러이다.

 

주소값을 보면, TransferHistory@2babf189과 TransferHistory@69e05f61 일치하지 않는 것을 볼 수 있다.

 

Q. 왜 일치하지 않을까?

final TransferHistory transferHistory = TransferHistory.builder()
                .transferAmount(transferAmount)
                .depositAccountNumber(depositAccountNumber)
                .withdrawalAccountNumber(withdrawalAccountNumber)
                .amountAfterWithdrawal(BigDecimal.ZERO)
                .amountAfterDeposit(BigDecimal.valueOf(20000)).build();

//when
when(accountRepository.getByAccountNumber(withdrawalAccountNumber)).thenReturn(withdrawalAccount);
when(accountRepository.getByAccountNumber(depositAccountNumber)).thenReturn(depositAccount);
when(transferHistoryRepository.save(transferHistory)).thenReturn(transferHistory);

//then
transferService.transfer(request);

 

TransferServiceTest

when(transferHistoryRepository.save(transferHistory)).thenReturn(transferHistory);

 

transferService.transfer

 

테스트 코드에서 builder 패턴으로 작성해준 transferHistory 인스턴스와 TransferService의 tranfer 메소드 내부에 존재하는

비즈니스 로직에서 transferHistory는 또다른 새로운 인스턴스를 생성하므로 주소값이 다르다. 즉, 완전히 다른 객체임을 알 수 있다.

 

✅ 해결방법

when(transferHistoryRepository.save(any())).thenReturn(transferHistory);

 

transferHistory 인스턴스를 생성해서 save에 넘겨주는 것이 아닌, any()를 사용해주면 된다. any()는 어떠한 타입의 transferHistory의 인스턴스를 받던지 상관없이 thenReturn의 인수로 넘겨주는 값을 return해준다.