Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon ¿Cuáles son las principales diferencias entre Whitebox de PowerMock y Whitebox de Mockito?


¿Cuáles son las principales diferencias entre Whitebox de PowerMock y Whitebox de Mockito?


Whitebox y Whitebox de Powermock son clases de utilidad utilizadas para acceder y manipular estados internos de clases, pero tienen diferencias claras en sus orígenes, funcionalidades y contextos de uso.

Origen y disponibilidad

- Whitebox de Mockito: esta era una clase interna dentro de Mockito que permitía a los usuarios establecer estados internos de objetos. Sin embargo, se eliminó de Mockito 2.x debido a las preocupaciones sobre la promoción de las malas prácticas de prueba y porque no estaba destinado a uso público [11]. Se alentó a los usuarios que confiaron en él para cambiar a alternativas como el bitero de PowerMock o implementar sus propias utilidades de reflexión [3].

- Whitebox de PowerMock: esto es parte de la biblioteca PowerMock, que extiende las capacidades de Mockito al permitir la burla de los métodos privados, estáticos y finales, entre otras características [5]. Whitebox de PowerMock proporciona una utilidad de reflexión simplificada destinada a las pruebas, permitiendo el acceso a miembros privados e invocación de métodos privados [2] [6].

funcionalidad

- Whitebox (Histórico) de Mockito: antes de su extracción, Whitebox de Mockito permitió a los usuarios establecer estados internos de objetos utilizando métodos como `setInternalState`. Esto fue útil para inyectar simulacros en clases sin setters públicos.

- Whitebox de PowerMock: ofrece un conjunto más amplio de funcionalidades, que incluyen:
- Acceso a miembros privados: métodos como `getInternalState` permiten la recuperación de valores de campo privado.
- Invocar métodos privados: el método 'Invokemethod` puede llamar métodos privados, incluidos los estáticos [4] [10].
- Configuración de campos privados: aunque no se documentan explícitamente, el Whitebox de PowerMock se puede usar para establecer campos privados a través de la reflexión, aunque este no es su propósito principal.

Contexto de uso

- Whitebox de Mockito: dado que ya no está disponible en Mockito 2.x, se aconseja a los usuarios que usen alternativas como PowerMock's Whitebox o 'ReflectionTutils` de Spring si corresponde [1] [3].

- Whitebox de PowerMock: típicamente utilizado en escenarios en los que es necesario acceso directo a miembros o métodos privados, a menudo en código heredado o cuando se prueba una lógica compleja que no se puede refactorizar fácilmente. Sin embargo, generalmente se recomienda evitar el uso de tales utilidades a menos que sea absolutamente necesario, ya que pueden omitir la encapsulación y conducir a pruebas frágiles [10].

En resumen, si bien ambos servicios de Whitebox tienen propósitos similares, la versión de PowerMock es más integral y ampliamente disponible, mientras que la versión de Mockito se eliminó debido a las preocupaciones sobre las prácticas de prueba. Whitebox de PowerMock es una herramienta poderosa para acceder y manipular los estados de clase interna, pero debe usarse juiciosamente.

Citas:
[1] https://stackoverflow.com/questions/40280918/whatdo-i-use-instead-of-whitebox-in-mockito-2-2-2---set-fields
[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-for-powermock/