Matt's Tidbits #82 - 예상치 못한 Mockito 제한 사항

Last week I wrote about the importance of taking vacation. 이번에는 뜻밖의 Mockito 제한에 대해 공유하고자 하는 이야기가 있습니다.

다음 예제 코드를 고려하십시오.




단위 테스트에서 ListProvider를 조롱하려면 다음을 수행하는 것이 매우 간단합니다.



<스크립트 아이디="gist-ltag"src="https://gist.github.com/mpeng3/2911a827d22e810523b9bdae56ea254e.js"/>


이것이 까다로워지는 경우는 ListProvider.currentList 에 대한 모의 구현을 제공하는 것에 대해 생각할 때입니다. 처음에는 이렇게 하려고 생각했습니다.




whenever(mockListProvider.currentList).thenReturn(listSubject.value)


이 문제는 listSubject 에 새 값을 게시하면 모의(그리고 확장하여 기본 주제)가 해당 시점에 평가되기 때문에 ListProvider.currentList에 대한 향후 호출에 반영되지 않는다는 것입니다. 정의되어 있습니다.



제가 생각해낸 한 가지 해결 방법은 테스트를 위해 다음과 같은 방법을 정의하는 것이었습니다.



<스크립트 아이디="gist-ltag"src="https://gist.github.com/mpeng3/43edf9e9498ea7214e354ca5b5be70a0.js"/>


listSubject 대신 이것을 사용하면 currentList에 대한 모의 값을 동시에 업데이트할 수 있습니다.



그러나 이것은 몇 가지 제한 사항이 있습니다. - 즉, 동료가 지적했듯이 매번 모의를 다시 초기화하는 것이 약간 지저분합니다.



다행히 Mockito는 이 - enter thenAnswer() 메소드에 조금 더 적합한 또 다른 옵션을 제공합니다.




whenever(mockListProvider.currentList).thenAnswer { listSubject.value }


이 방법을 사용할 때 주의해야 할 점은 유형 안전하지 않다는 것입니다. - .thenAnswer { 42 }를 작성하는 것은 완벽하게 유효하며, 테스트를 실행할 때 무언가 잘못했다는 것을 알게 될 것입니다.



고려할 사항 한 가지 더 - Mockito는 가장 Kotlin 친화적인 프레임워크가 아니므로 코드의 대부분이 Kotlin에 있는 경우 MockK 을 고려하여 동일하게 작성할 수 있습니다. 다음과 같은 코드:



<스크립트 id="gist-ltag"src="https://gist.github.com/mpeng3/56061c36102034e2158e8e5588233634.js"/>


이를 더 개선할 수 있는 아이디어/제안 사항이 있습니까? 아래 의견에 알려주십시오! 그리고 앞으로의 소소한 소식에 대한 알림을 받고 싶으시다면 Medium에서 저를 팔로우해주세요.



이 정보는 2020년 6월 25일에 발견되었습니다.

좋은 웹페이지 즐겨찾기