0
votes

Méthode de test en classe abstraite une fois et non pour chaque mise en œuvre

Pour le moment, j'ai une classe abstraite qui implémente une interface. Toutes les implémentations étendent la classe abstraite pour effectuer une mise en œuvre propre des méthodes d'interface.

La classe abstraite contient des méthodes identiques pour chaque mise en œuvre f.e. une méthode d'exécution. Je ne veux pas inclure le même test "exécuté" pour chaque classe de mise en œuvre.

Je peux tester avec succès la méthode d'exécution dans la classe Abstract en créant une classe de test pour l'une des classes de mise en œuvre. Le problème est qu'il y aura plus de classes extension de cette classe abstraite et je ne veux pas écrire le même test d'exécution dans chacune de ces classes.

J'aimerais tester en quelque sorte la méthode d'exécution de la classe abstraite une seule fois dans une classe de test spécifique afin que je ne puisse tester que la logique de mise en œuvre de toutes les autres classes.


1 commentaires

spectacle et exemple SUT et ce que vous avez essayé dans votre test


3 Réponses :


0
votes

Vous pouvez également créer une classe de test pour votre classe abstraite. Bien que vous ne puissiez pas installer directement la classe abstraite, vous pouvez toujours créer une classe de mise en œuvre concrète dans votre fichier de test, uniquement pour tester la classe abstraite, mettre en œuvre les méthodes requises. Vous pouvez obtenir une instance pour tester E.G. Utilisation d'une classe anonyme:

AbstractClassType x = new AbstractClassType() {
    @Override
    public void doSomething() {
        // ...
    }
};


0 commentaires

0
votes
public interface BlaInterface {
    public String getData();
}

public abstract class AbstractBla implements BlaInterface {

    // methot to test only once and not for each class extending this
    public void execute() {

        // do some stuff which is the same for each extending class
        getData();
    }
}

public class BlaBla extends AbstractBla {

    public String getData() {
        return "Blabla";
    }
}
So F.E. the above classes I can test the execute() method by testing the BlaBla class. But there will be more classes extending the abstract class and I find it ugly to put the execute() test just random in one of those classes.So I would like an abstract test for the execute and other test classes just for testing getData f.e.       

0 commentaires

0
votes

Vous pouvez également créer une classe de test paramétrée, qui prend les instances avec le résultat attendu comme entrée et exécute les tests. (Toutefois, si vous avez beaucoup de logique de vérification qui diffère fortement entre les différentes instances, l'approche de @Vlumi pour créer une classe de test abstraite pourrait mieux fonctionner, car vous pouvez déplacer la logique de vérification en méthodes abstraites.)

public class MyParameterizedTests {

    @ParameterizedTest
    @MethodSource("getTestData")
    public void test(TestData data) {
        assertEquals(data.expectedResult, data.instance.compute());
    }

    public static TestData[] getTestData() {
        return new TestData[] { new TestData(new X(), "x"), new TestData(new Y(), "y") };
    }
}

class TestData {
    public MyInterface instance;
    public String expectedResult;

    public TestData(MyInterface instance, String expectedResult) {
        this.instance = instance;
        this.expectedResult = expectedResult;
    }
}

interface MyInterface {
    String compute();
}

class X implements MyInterface {

    @Override
    public String compute() {
        return "x";
    }
}

class Y implements MyInterface {

    @Override
    public String compute() {
        return "y";
    }
}


0 commentaires