스프링

mocking 아규먼트 불일치

winwin-k9 2023. 7. 30. 17:59

서비스 계층의 테스트를 하고 있었다.

 

@Test
    @DisplayName(value = "멤버저장테스트")
    public void saveMemberTest() {
        //given
        FormSignUpRequest formSignUpRequest = new FormSignUpRequest(
                "kim@naver.com", 10,
                "qwert1234!", "testName",
                "MALE", 170.5, 40.5, 0.1, 0.1, 0.1, 0.1);
        Member member = generateMember("qwert1234!");
        when(memberRepository.save(member)).thenReturn(member);
        ...
        ...

발생한 에러는 다음과 같다.

 

Strict stubbing argument mismatch. Please check:
 - this invocation of 'save' method:
    memberRepository.save(
    com.backend.nutt.domain.Member@58399d82
);
    -> at com.backend.nutt.service.MemberService.saveMember(MemberService.java:45)
 - has following stubbing(s) with different arguments:
    1. memberRepository.save(
    com.backend.nutt.domain.Member@6bd16207
);
      -> at com.backend.nutt.service.MemberServiceTest.saveMemberTest(MemberServiceTest.java:54)
Typically, stubbing argument mismatch indicates user mistake when writing tests.
Mockito fails early so that you can debug potential problem easily.
However, there are legit scenarios when this exception generates false negative signal:
  - stubbing the same method multiple times using 'given().will()' or 'when().then()' API
    Please use 'will().given()' or 'doReturn().when()' API for stubbing.
  - stubbed method is intentionally invoked with different arguments by code under test
    Please use default or 'silent' JUnit Rule (equivalent of Strictness.LENIENT).
For more information see javadoc for PotentialStubbingProblem class.
org.mockito.exceptions.misusing.PotentialStubbingProblem:

given의 파라미터와 when의 파라미터를 실행할 때 작동되는 save의 객체가 서로 다르기 때문에 에러가 발생하는 것이다.

 

따라서 Stubbing을 할 때 정의한 객체를 매개변수에 넣는 것이 아니라 any()를 사용해야 한다.

어떤 인스턴스를 받는지 상관없이 미리 만들어둔 객체를 return하게 목킹을 하려면 any()를 사용하는것이 좋다.

728x90