Zombando de um método de cancelamento com o EasyMock
1. Visão geral
As estruturas de zombaria são usadas para zombar da interação com dependências, a fim de testar nossas classes isoladamente. Normalmente, zombamos das dependências para retornar os vários valores possíveis. Dessa forma, podemos garantir que nossa classe possa lidar com cada um desses valores.
Mas, às vezes, podemos ter que zombar de métodos de dependência que não retornam nada.
Neste tutorial,we will see when and how to mock void methods using EasyMock.
2. Dependência do Maven
Primeiro, vamos adicionarthe EasyMock dependency ao nossopom.xml:
org.easymock
easymock
4.0.2
test
3. Quando zombar de um métodovoid
Quando testamos classes com dependências, normalmente queremos cobrir todos os valores retornados pela dependência. Mas, às vezes, os métodos de dependência não retornam um valor. Então,if nothing is returned, why would we want to mock a void method?
Mesmo que os métodos void não retornem um valor,they might have side-effects. Um exemplo disso é o métodoSession.save(). Quando salvamos uma nova entidade, o métodosave() gera um id e o define na entidade passada.
Por esse motivo, precisamos zombar do método nulo para simular os vários resultados do processamento.
Outra hora em que a zombaria pode ser útil é ao testar exceções geradas pelo método void.
4. Como simular um métodovoid
Agora, vamos ver como podemos simular um método void usando EasyMock.
Vamos supor que temos que simular o método void de uma classeWeatherService que toma uma localização e define a temperatura mínima e máxima:
public interface WeatherService {
void populateTemperature(Location location);
}
4.1. Criando o objeto mock
Vamos começar criando uma simulação paraWeatherService:
@Mock
private WeatherService mockWeatherService;
Aqui, fizemos isso usando a anotação EasyMock@Mock. Mas, podemos fazer isso usando o métodoEasyMock.mock() também.
A seguir, vamos registrar as interações esperadas com a simulação chamandopopulateTemperature():
mockWeatherService.populateTemperature(EasyMock.anyObject(Location.class));
Agora, se não quisermos simular o processamento deste método, esta chamada em si é suficiente para simular o método.
4.2. Lançando uma exceção
Primeiro, vamos pegar o caso em que queremos testar se nossa classe pode lidar comexceptions thrown by the void method. Para isso, teremos que simular o método de forma que ele lance essas exceções.
Em nosso exemplo, o método lançaServiceUnavailableException:
EasyMock.expectLastCall().andThrow(new ServiceUnavailableException());
Como visto acima, isso envolve simplesmente chamar o métodoandThrow(Throwable).
4.3. Simulando o comportamento do método
Conforme mencionado anteriormente, às vezes podemos precisar desimulate the behavior of the void method.
No nosso caso, isso envolveria o preenchimento das temperaturas mínima e máxima dos locais passados:
EasyMock.expectLastCall()
.andAnswer(() -> {
Location passedLocation = (Location) EasyMock.getCurrentArguments()[0];
passedLocation.setMaximumTemparature(new BigDecimal(MAX_TEMP));
passedLocation.setMinimumTemperature(new BigDecimal(MAX_TEMP - 10));
return null;
});
Aqui, usamos o métodoandAnswer(IAnswer) para definir o comportamento do métodopopulateTemperature() quando chamado. Em seguida, usamos o métodoEasyMock.getCurrentArguments() - que retorna os argumentos passados para o método simulado - para modificar os locais passados.
Observe que temosreturned null at the end. Isso ocorre porque estamos zombando de um método void.
Também é importante notar que esta abordagem não se restringe apenas a métodos vazios de simulação. Também podemos usá-lo para métodos que retornam um valor. Lá, é útil quando queremos zombar do método para retornar valores com base nos argumentos passados.
4.4. Repetindo o método simulado
Por último, usaremos o métodoEasyMock.replay() para alterar a simulação para o modo "repetir", de modo que as ações gravadas possam ser reproduzidas quando chamadas:
EasyMock.replay(mockWeatherService);
Consequentemente, quando chamamos o método de teste, o comportamento personalizado definido deve ser executado.
5. Conclusão
Neste tutorial, vimos como zombar de métodos nulos usando o EasyMock.
E, claro, o código usado neste artigo pode ser encontradoover on GitHub.