# Mocking de méthodes et classes finales

Par défaut, Mockito ne permet pas de mocker les classes et les méthodes final. Le support pour ces cas d'utilisation a néanmoins été ajouté à partir des versions >= 2.1.0 en mode incubation. Cette article décrit comment ajouter cette fonctionnalité.

WARNING

Lorsqu'une classe finale est mockée sans que la fonctionnalité soit activée, Mockito renvoie l'erreur suivante:

org.mockito.exceptions.base.MockitoException: 
Cannot mock/spy ...
Mockito cannot mock/spy because :
 - final class
1
2
3
4

# Installation with maven

Si ce n'est pas déjà fait, ajouter Mockito comme dépendance de test et vérfier que sa version est supérieure ou égale à la version 2.1.0.

<dependencies>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>2.28.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>
1
2
3
4
5
6
7
8

# Configuration

Pour activer le support des mock sur les classes et les méthodes finales, il suffit d'ajouter le fichier src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker avec comme seule ligne:

mock-maker-inline
1

# Usage

A partir de là, il est possible de créer des mocks des méthodes et des classes finales de la même manière que pour n'importe quelles autres méthodes ou classes. Par exemple, mocker la classe suivante n'est plus un problème:

public final class PopulationDensity {

  public final double of(Country country) {
    return country.getPopulation() / country.getAreaInSqKm();
  }
}
1
2
3
4
5
6


 
 



@Test
public void mockFinalClass() {
  PopulationDensity density = mock(PopulationDensity.class);
  when(density.of(any())).thenReturn(42d);
  assertThat(density.of(Country.FRANCE)).isEqualTo(42d);
  assertThat(density.of(Country.CHINA)).isEqualTo(42d);
}
1
2
3
4
5
6
Dernière mise à jour: 7/2/2019, 12:26:00 AM