Maison >Java >javaDidacticiel >Comment puis-je me moquer des classes finales en Java à l'aide de Mockito ?

Comment puis-je me moquer des classes finales en Java à l'aide de Mockito ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-09 21:38:11937parcourir

How Can I Mock Final Classes in Java Using Mockito?

Se moquer des classes finales avec Mockito

Dans le domaine des tests Java, se moquer des classes non finales est une pratique courante pour isoler les dépendances et tester code dans un environnement contrôlé. Cependant, les classes finales posent un défi distinct lorsqu'il s'agit de se moquer.

Par exemple, considérons l'exemple suivant :

public final class RainOnTrees {
   public void startRain() {}
}

public class Seasons {
   RainOnTrees rain = new RainOnTrees();
   public void findSeasonAndRain() {rain.startRain();}
}

Dans ce scénario, nous avons une classe finale nommée RainOnTrees et une classe Saisons qui en dépend. Pour tester efficacement Seasons, nous devons nous moquer de RainOnTrees. Cependant, se moquer des classes finales n'est pas intrinsèquement possible avec Mockito version 1.

Mockito Inline to the Rescue

Pour surmonter cette limitation, Mockito version 2 a introduit le mockito-inline package qui permet de se moquer des classes statiques et finales, y compris des constructeurs. Pour utiliser cette fonctionnalité, ajoutez la dépendance suivante à votre fichier Gradle :

testImplementation 'org.mockito:mockito-inline:2.13.0'

Mocking with Mockito Inline

Une fois le package mockito-inline ajouté, mockito-inline les cours deviennent simples :

@ExtendWith(MockitoExtension.class)
public class SeasonsTest {
    @Mock
    RainOnTrees rainMock;

    @BeforeEach
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testFindSeasonAndRain() {
        Seasons seasons = new Seasons();
        // Inject the mock into the Seasons class
        ReflectionTestUtils.setField(seasons, "rain", rainMock);

        seasons.findSeasonAndRain();

        // Verify that the mocked method was called
        Mockito.verify(rainMock).startRain();
    }
}

Finale Notes

Il est important de noter que les classes finales moqueuses doivent être utilisées judicieusement, car elles peuvent conduire à des tests fragiles qui peuvent échouer si l'implémentation de la classe finale change. Lorsque cela est possible, la création de classes non finales pour l'injection de dépendances est une approche privilégiée pour les tests.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn