24 votes

jUnit ignore les méthodes @Test de la classe de base

Supposons que j'aie une classe de test appelée testFixtureA avec plusieurs méthodes testA , testB , testC etc, chacun avec @Test annotation.

Supposons maintenant que je sous-classe testFixtureA dans une classe appelée testFixtureAB et je n'écrase rien. testFixtureAB est vide pour l'instant.

Lorsque j'exécute des tests à partir de testFixtureAB , méthodes testA , testB y testC sont exécutées par le programme de test car celui-ci ne fait pas de distinction entre les méthodes de test de la classe et celles de la classe de base.

Comment puis-je forcer l'exécution des tests à laisser de côté les tests de la classe de base ?

27voto

Matthew Flynn Points 1593

et je n'écrase rien. testFixtureAB est vide pour l'instant

Voilà votre réponse. Si vous voulez que testB ne soit pas exécuté à partir de la classe principale, passez la commande :

public class testFixtureAB extends testFixtureA {
   @Override
   public void testB() {}
}

24voto

Bozho Points 273663

Restructurez vos classes de test.

  • Si vous ne voulez pas utiliser les tests de la classe de base, ne l'étendez pas.
  • Si vous avez besoin d'autres fonctionnalités de la classe de base, séparez cette classe en deux : les tests et les autres fonctionnalités.

12voto

dfa Points 54490

En ignorant toute la classe de base :

@Ignore
class BaseClass {
   // ...
}

voir cet exemple

10voto

user1607938 Points 46

C'est assez facile à réaliser en mettant en œuvre quelques classes :

  • Créez votre propre TestRunner
  • Créer une annotation comme @IgnoreInheritedTests
  • Créer une classe qui étend org.junit.runner.manipulation.Filter

Sur la classe de filtre :

public class InheritedTestsFilter extends Filter {

    @Override
    public boolean shouldRun(Description description) {
        Class<?> clazz = description.getTestClass();
        String methodName = description.getMethodName();
        if (clazz.isAnnotationPresent(IgnoreInheritedTests.class)) {
            try {
                return clazz.getDeclaredMethod(methodName) != null;
            } catch (Exception e) {
                return false;
            }
        }
        return true;
    }

    @Override
    public String describe() {
        // TODO Auto-generated method stub
        return null;
    }

}

sur votre chemin de fer personnalisé :

 /**
 * @param klass
 * @throws InitializationError
 * @since
 */
public CustomBaseRunner(Class<?> klass) throws InitializationError {
    super(klass);
    try {
        this.filter(new InheritedTestsFilter());
    } catch (NoTestsRemainException e) {
        throw new IllegalStateException("class should contain at least one runnable test", e);
    }
}

2voto

York Points 433

Dans Junit 5, vous pouvez rendre la classe de base abstraite et l'étendre avec une classe concrète.

Lorsque vous exécutez l'abstract dans votre IDE, votre sous-classe sera exécutée à la place.

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