복붙노트

[SPRING] Mockito.when 같은 물건에 여러 번 전화를?

SPRING

Mockito.when 같은 물건에 여러 번 전화를?

Mockito를 Spring과 함께 사용할 때, Bean 선언을 통해 Mock 객체를 생성하면 ...

<bean id="accountMapper" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="org.example.persistence.mybatis.mappers.AccountMapper" /> 
</bean>     

... 모의 객체를 다시 설정하지 않고 여러 번 Mockito.when를 호출 할 때 이상한 동작을 발견했습니다. 예를 들면 다음과 같습니다.

Mockito.when(this.accountMapper.createBadGrammarException()).thenThrow(new BadSqlGrammarException("Bla", null, new SQLException()));

이 코드 ( "Mockito.when")가 동일한 모의 테스트에서 여러 번 호출되면 테스트는 오류로 실패합니다 (BadSqlGrammerException -이 예외가 실제로 예상되는 경우에도 - 오류가 발생 함). 예외를 던지지 않고 수동으로 던지면 괜찮습니다.) 이 예상되는 동작입니까? Mockito는 매번 새로운 모의 객체를 만들 것을 제안하는 것으로 보이는데, 이는 각 메소드마다 DAO를 만드는 것을 의미 할 것입니다 ...?

Mockito라는 방법을 두 번 호출하면 정확히 어떻게됩니까? 가짜는 어떻게 반응해야합니까? 행동 바꾸기? 무시해? 불행하게도 대부분의 검색은 메서드 자체에 대한 여러 호출에 대해 서로 다른 결과를 반환하는 방법에 대한 결과 만 가져 오지만 Mockito.when에 대한 여러 호출에 대해 예상되는 것은 아닙니다.

Mockito와 모범 사례에 대해 이해하려고 노력하고 있습니다. 왜냐하면 무언가로가는 것은 단순히 작품을 본다는 것이 나쁜 생각 인 것 같습니다 ...

해결법

  1. ==============================

    1.Mockito의 문제점 중 하나는 전달할 인수가 사용자가 작성하려고하는 표현식이라는 것입니다. 따라서 같은 메서드 호출을 위해 Mockito를 두 번 사용할 때 두 번째 사용하면 실제로 처음에 쓴 동작을 얻게됩니다.

    Mockito의 문제점 중 하나는 전달할 인수가 사용자가 작성하려고하는 표현식이라는 것입니다. 따라서 같은 메서드 호출을 위해 Mockito를 두 번 사용할 때 두 번째 사용하면 실제로 처음에 쓴 동작을 얻게됩니다.

    실제로 Mockito를 사용하지 않는 것이 좋습니다. 언제. 당신이 그것을 사용할 때 빠질 수있는 많은 함정들이 있습니다 - 당신이 다른 구문을 필요로 할 때가 꽤 있습니다. "더 안전한"대체 구문은 Mockito 메서드의 "do"패밀리입니다.

    doReturn(value).when(mock).method(arguments ...);
    doThrow(exception).when(mock).method(arguments ...);
    doAnswer(answer).when(mock).method(arguments ...);
    

    그래서 당신의 경우에, 당신은

    doThrow(new BadSqlGrammarException(??, ??, ??)).when(accountMapper).createBadGrammarException();
    

    Mockito를 시작하는 경우 "할"가족을 사용하는 방법을 배우는 것이 좋습니다. 그것들은 무효화 된 방법을 모방 할 수있는 유일한 방법이며, Mockito 문서에 구체적으로 언급되어 있습니다. 그러나 Mockito.when를 사용할 수있을 때마다 사용할 수 있습니다. 따라서 "do"제품군을 사용하면 테스트의 일관성이 향상되고 학습 곡선이 줄어들게됩니다.

    "do"패밀리를 사용해야하는 경우에 대한 자세한 내용은 Mockito "grammars"작성에 대한 내 대답을 참조하십시오.

  2. ==============================

    2.간단한 대답은 다음과 같습니다. Mockito.when (object.fooMethod ()). then ()을 작성하면 fooMethod ()가 실제로 호출됩니다. 또 다른 요점은 조롱 된 객체를 호출했기 때문에 처음으로 관찰 할 수 없다는 것입니다. 그러나 우리가 두 번째로 쓸 때 fooMethod ()에 대한 어떤 행동을합니다 (우리는 이전에 예외를 설정했습니다, 예외적으로).

    간단한 대답은 다음과 같습니다. Mockito.when (object.fooMethod ()). then ()을 작성하면 fooMethod ()가 실제로 호출됩니다. 또 다른 요점은 조롱 된 객체를 호출했기 때문에 처음으로 관찰 할 수 없다는 것입니다. 그러나 우리가 두 번째로 쓸 때 fooMethod ()에 대한 어떤 행동을합니다 (우리는 이전에 예외를 설정했습니다, 예외적으로).

    이것을 더 잘 확인하기 위해 객체를 엿볼 수 있습니다 :

    Bar spyBar = Mockito.spy(Bar.class)
    when(spyBar.fooMethod()).then()...
    

    fooMethod ()가 실제로 호출됩니다.

  3. from https://stackoverflow.com/questions/31512245/calling-mockito-when-multiple-times-on-same-object by cc-by-sa and MIT license