6.1 Zombando do método estático mockStatic()
E mais um ponto importante é a simulação e verificação de métodos estáticos. “O que há de errado com isso?”, você pergunta. Sim, estático, mas os métodos são os mesmos. E você estará errado.
Lembra onde começamos a aprender sobre objetos fictícios? Como esses objetos são criados artificialmente por meio do arquivo DynamicProxy
. E os métodos estáticos não estão vinculados a nenhum objeto e DynamicProxy
é impossível interceptar chamadas para eles por meio de . Isso é tudo.
Mas os criadores do Mockito também conseguiram se esquivar aqui - eles escreveram seu próprio carregador de classes e, com sua ajuda, foram capazes de substituir as classes em tempo real. Um trabalho grande e difícil, mas eles ainda conseguiram fazê-lo.
Você precisará adicionar uma biblioteca adicional para pom.xml
:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>
Veja como trabalhar se você precisar zombar de um método estático.
1 Crie um objeto de classe mock especial:
MockedStatic<ClassName>managerObject = Mockito.mockStatic(ClassName.class);
2 Adicione regras de operação a este objeto:
A este objeto da regra é preciso se apegar de outras formas.
managerObject.when(ClassName::method name).thenReturn(result);
3 Certifique-se de envolver o uso deste objetotry-with-resources
para que o objeto seja excluído imediatamente e o Mockito possa limpar as regras associadas a ele.
Exemplo:
@Test
void givenStaticMethodWithNoArgs () {
try (MockedStatic< StaticUtils> utilities = Mockito.mockStatic( StaticUtils.class)) {
// add rule
utilities.when(StaticUtils::name).thenReturn("Hello");
// check if the rule works
assertEquals("Hello", StaticUtils.name());
}
}
Não tão bonito quanto com anotações @Mock
e @Spy
, mas muito prático. Era muito difícil escrever testes quando era impossível zombar de um método estático simples que era usado dentro dos métodos em teste.