[SPRING] Mockito.when 같은 물건에 여러 번 전화를?
SPRINGMockito.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.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.간단한 대답은 다음과 같습니다. 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 ()가 실제로 호출됩니다.
from https://stackoverflow.com/questions/31512245/calling-mockito-when-multiple-times-on-same-object by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 컨테이너 톰캣 서버에서 전개 된 (Spring Boot) 전쟁의 컨텍스트 경로 변경. 따라서 데모가 아닙니다.-0.01-SNAPSHOT (0) | 2019.03.17 |
---|---|
[SPRING] 폼 로그인없이 스프링 보안 (0) | 2019.03.17 |
[SPRING] spring mvc rest controller에서 base64로 인코딩 된 바이트 [] 대신 이진 데이터를 반환하는 방법 (0) | 2019.03.17 |
[SPRING] Spring 4.0에서의 문자열 변환 (0) | 2019.03.17 |
[SPRING] 스프링 캐스팅 자동 캐스팅 (0) | 2019.03.17 |