Mock Static Method usando JMockit
1. Visão geral
Algumas bibliotecas de mocking populares, comoMockito and Easymock, geram mock-ups aproveitando o modelo de classe baseado em herança do Java EasyMock implements an interface at runtime, whereas Mockito inherits from the target class to create a mocking stub.
Nenhuma abordagem funciona bem para métodos estáticos, pois os métodos estáticos estão associados a uma classe e não podem ser substituídos. No entanto,JMockit does provide a static method mocking features.
Neste tutorial, vamos explorar alguns desses recursos.
Para obter uma introdução ao JMockit, consulte nossoprevious article.
2. Dependências do Maven
Vamos começar com as dependências do Maven:
org.jmockit
jmockit
1.24
test
Você pode encontrar as versões mais recentes dessas bibliotecas emMaven Central.
3. Método estático chamado de método não estático
Primeiro, vamos considerar um caso em que temosa class with a non-static method that internally depends upon static method:
public class AppManager {
public boolean managerResponse(String question) {
return AppManager.isResponsePositive(question);
}
public static boolean isResponsePositive(String value) {
if (value == null) {
return false;
}
int length = value.length();
int randomNumber = randomNumber();
return length == randomNumber ? true : false;
}
private static int randomNumber() {
return new Random().nextInt(7);
}
}
Agora, queremos testar o métodomanagerResponse(). Como seu valor de retorno depende de outro método, precisamos simular o métodoisResponsePositive().
Podemos simular este método estático usandoJMockit’s classe anônimamockit.MockUp.MockUp<T> (where T will be the class name) e@Mock annotation:
@Test
public void givenAppManager_whenStaticMethodCalled_thenValidateExpectedResponse() {
new MockUp() {
@Mock
public boolean isResponsePositive(String value) {
return false;
}
};
assertFalse(appManager.managerResponse("Some string..."));
}
Aqui, estamos simulandoisResponsePositive() com um valor de retorno que gostaríamos de usar para o teste. Portanto, verifique o resultado esperado usando o utilitárioAssertions disponível em Junit-5.
4. Método estático privado de teste
Em alguns casos, outros métodos usam métodos estáticos privados da classe:
private static Integer stringToInteger(String num) {
return Integer.parseInt(num);
}
Para testar esse método,we’d need to mock private static method. Podemos usar o método de sutilidadeDeencapsulation.invoke() fornecido porJMockit:
@Test
public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() {
int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110");
assertEquals(110, response);
}
Como o nome sugere, seu objetivo éde-encapsulate o estado de um objeto. Dessa maneira, o JMockit simplifica os métodos de teste que não poderiam ser testados de outra forma.
5. Conclusão
Neste artigo, vimos como métodos estáticos podem ser simulados usandoJMockit. Para uma análise mais aprofundada de alguns dos recursos avançados do JMockit, dê uma olhada em nosso JMockit Advanced Usagearticle.
Como de costume, o código-fonte completo deste tutorial está disponívelover on GitHub.