3 votes

JMockit : Comment éviter le code des constructeurs des superclasses

J'ai besoin de tester une classe SportCar, qui étend Car. Le problème est que lorsque je crée mon objet de test

SportCar car = new SportCar();

cela appellera également le constructeur des classes parentes, par exemple, Car(). Ces constructeurs font beaucoup de choses, ont beaucoup de dépendances de l'environnement et nécessitent beaucoup de fichiers de configuration que je n'ai pas, donc je voudrais créer une instance de SportCar sans appeler les constructeurs hérités.

La seule solution que je connaisse pour cela est de créer un Mockup pour Car dans lequel je surcharge le constructeur ($init) et le bloc statique ($clinit). Mais maintenant mon problème est, que se passe-t-il s'il y a de nombreuses classes dans ma hiérarchie (SportCar étend Car qui étend A qui étend B qui étend C...) et que je veux éviter tous les constructeurs ? Dois-je créer des Mocks pour TOUTES les classes précédentes ?

class A extends B {
    public A() {
        // Beaucoup de choses à éviter pendant les tests
    }
}

class Car extends A {
    public Car() {
        // Beaucoup de choses à éviter pendant les tests
    }
}

class SportCar extends Car() {
}

4voto

Si vous utilisez jmockit, vous n'avez rien à faire du tout, car tous les constructeurs de superclasse sont automatiquement mockés. Dans votre méthode de test unitaire, vous pouvez simplement faire:

public void testMockedStuff(@Mocked final ClassToBeMocked instance) {

pour que tout soit mocké pour vous. Vous n'avez même pas à créer les instances vous-même. Ensuite, vous pouvez modifier les paramètres d'annotation pour exclure les méthodes que vous testez du mocking.

1voto

Bohemian Points 134107

Créez un constructeur protégé "ne rien faire" dans Car et ayez un constructeur protégé dans SportsCar qui l'appelle et appelez-le depuis votre classe de test, qui peut voir ce constructeur d'ailleurs - elle a les privilèges pour le faire.

Cela pourrait être considéré comme un léger étirement du pattern "design for test".

1voto

Garrett Hall Points 11902

Vous pouvez supprimer le constructeur parent en utilisant PowerMock

suppress(constructor(EvilParent.class));

Cependant, si vous devez réaliser de nombreux tests unitaires, il peut être utile de trouver comment falsifier l'environnement également. Ou convaincre les autres développeurs de vous permettre de faire un peu de refactoring pour permettre au moins l'injection de services.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X