O WhiteBox da Powermock e o Whitebox da Mockito são as duas classes de serviços públicos usados para acessar e manipular estados internos de classes, mas têm diferenças distintas em suas origens, funcionalidades e contextos de uso.
Origem e disponibilidade
- Whitebox da Mockito: essa era uma classe interna no Mockito que permitiu aos usuários definir estados internos de objetos. No entanto, foi removido do Mockito 2.x devido a preocupações sobre a promoção de práticas ruins de testes e porque não se destinava ao uso público [11]. Os usuários que confiaram nele foram incentivados a mudar para alternativas como o PowerMock da PowerMock ou implementar seus próprios utilitários de reflexão [3].
- WhiteBox da PowerMock: isso faz parte da Biblioteca Powermock, que estende os recursos da Mockito, permitindo a zombaria de métodos privados, estáticos e finais, entre outros recursos [5]. O WhiteBox da PowerMock fornece uma utilidade de reflexão simplificada destinada a testes, permitindo acesso a membros privados e invocação de métodos privados [2] [6].
funcionalidade
- WhiteBox da Mockito (histórico): Antes de sua remoção, o WhiteBox da Mockito permitia que os usuários definissem estados internos de objetos usando métodos como `SetinternalState '. Isso foi útil para injetar zombarias em classes sem setters públicos.
- Whitebox da PowerMock: oferece um conjunto mais amplo de funcionalidades, incluindo:
- Acessando membros privados: métodos como `getInternalState` permitem a recuperação dos valores de campo privado.
- Invocando métodos privados: o método "Invokemethod" pode chamar métodos privados, incluindo os estáticos [4] [10].
- Definir campos privados: Embora não esteja explicitamente documentado, o WhiteBox do PowerMock pode ser usado para definir campos privados através da reflexão, embora esse não seja o seu principal objetivo.
contexto de uso
- WhiteBox da Mockito: como não está mais disponível no Mockito 2.x, os usuários são aconselhados a usar alternativas como o Whitebox da PowerMock ou o `RefllectionTestutils` da Spring, se aplicável [1] [3].
- WhiteBox da PowerMock: normalmente usado em cenários em que o acesso direto a membros privados ou métodos é necessário, geralmente no código herdado ou ao testar a lógica complexa que não pode ser facilmente refatorada. No entanto, geralmente é recomendável evitar o uso desses utilitários, a menos que seja absolutamente necessário, pois eles podem ignorar o encapsulamento e levar a testes quebradiços [10].
Em resumo, enquanto ambos os utilitários da WhiteBox servem a propósitos semelhantes, a versão do PowerMock é mais abrangente e amplamente disponível, enquanto a versão da Mockito foi removida devido a preocupações com as práticas de teste. O WhiteBox da Powermock é uma ferramenta poderosa para acessar e manipular estados de classe interna, mas deve ser usada criteriosamente.
Citações:[1] https://stackoverflow.com/questions/40280918/what-do-i-use-insead-of-whitebox-in-mockito-2-2-para-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-overpowermock-migration-tips-and-tricks-top-ten-118c52abd1d8
[4] https://johnmullins.co
[5] https://www.caloftinc.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/