PowerMock의 Whitebox와 Mockito의 Whitebox는 내부 클래스 상태에 액세스하고 조작하는 데 사용되는 유틸리티 클래스이지만, 기원, 기능 및 사용 컨텍스트에 뚜렷한 차이가 있습니다.
원산지 및 가용성
-Mockito의 Whitebox : 이것은 Mockito 내의 내부 클래스로 사용자가 내부 객체 상태를 설정할 수있었습니다. 그러나 나쁜 테스트 관행 촉진에 대한 우려와 공공 사용을위한 것이 아니기 때문에 Mockito 2.X에서 제거되었습니다 [11]. 이에 의존 한 사용자는 PowerMock의 Whitebox와 같은 대안으로 전환하거나 자체 반사 유틸리티를 구현하도록 권장되었습니다 [3].
- PowerMock의 Whitebox : 이것은 PowerMock 라이브러리의 일부이며, 다른 기능들 중에서도 개인, 정적 및 최종 방법의 조롱을 허용하여 Mockito의 기능을 확장합니다 [5]. PowerMock의 Whitebox는 테스트를위한 단순화 된 반사 유틸리티를 제공하여 개인 구성원에게 액세스하고 개인 방법의 호출을 가능하게합니다 [2] [6].
기능
-Mockito 's Whitebox (Historical) : 제거하기 전에 Mockito의 Whitebox는 사용자가'setinternalstate '와 같은 메소드를 사용하여 내부 객체 상태를 설정할 수 있도록 허용했습니다. 이것은 공개 세터가없는 수업에 모의를 주입하는 데 유용했습니다.
- PowerMock의 Whitebox : 다음을 포함하여 더 넓은 기능 세트를 제공합니다.
- 개인 회원 액세스 :`getinternalstate '와 같은 메소드는 개인 필드 값을 검색 할 수 있습니다.
- 개인 방법 호출 : 'invokemethod'방법은 정적 방법을 포함하여 개인 메소드를 호출 할 수 있습니다 [4] [10].
- 개인 필드 설정 : 명시 적으로 문서화되지는 않지만 PowerMock의 Whitebox를 사용하여 반사를 통해 개인 필드를 설정하는 데 사용될 수 있지만, 이는 주요 목적은 아닙니다.
사용 컨텍스트
-Mockito의 Whitebox : Mockito 2.X에서는 더 이상 사용할 수 없으므로 사용자는 PowerMock의 Whitebox 또는 Spring 's`reflectionTestutils'와 같은 대안을 사용하는 것이 좋습니다 [1] [3].
- PowerMock의 Whitebox : 일반적으로 개인 구성원 또는 방법에 직접 액세스 해야하는 시나리오에서 사용되거나 종종 레거시 코드 또는 쉽게 리팩게 할 수없는 복잡한 논리를 테스트 할 때. 그러나 일반적으로 캡슐화를 우회하고 취성 테스트를 이끌어 낼 수 있기 때문에 절대적으로 필요한 경우에도 이러한 유틸리티 사용을 피하는 것이 좋습니다 [10].
요약하면, 두 화이트 박스 유틸리티는 비슷한 목적으로 사용되지만 PowerMock의 버전은 더 포괄적이고 광범위하게 이용 가능하지만 Mockito의 버전은 테스트 관행에 대한 우려로 인해 제거되었습니다. PowerMock의 Whitebox는 내부 클래스 상태에 액세스하고 조작하기위한 강력한 도구이지만 신중하게 사용해야합니다.
인용 :[1] https://stackoverflow.com/questions/40280918/what-do-i-us-instead-of--mockito-2-2-to-set-set-pields
[2] https://www.javadoc.io/doc/org.powermock/powermock-reflect/1.6.5/org/powermock/reflect/whitebox.html
[3] https://proandroiddev.com/mockito-2-x-over-powermock-migration-tips-and-tricks-top-ten-118c52ABD1D8
[4] https://johnmullins.co
[5] https://www.calsoftinc.com/blogs/unit-testing-mockito-powermockito.html
[6] https://www.javadoc.io/doc/org.powermock/powermock-reflect/latest/org/powermock/reflect/whitebox.html
[7] https://github.com/mockito/mockito/issues/422
[8] https://www.alibabacloud.com/blog/598057
[9] https://www.lambdatest.com/automation-testing-advisor/selenium/classes/org.powermock.reflect.whitebox
[10] https://github.com/powermock/powermock/wiki/bypass-encapsulation
[11] https://github.com/mockito/mockito/issues/489
[12] https://code.haleby.se/2017/02/03/a-case-fowermock/