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 @Mocke @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.