91 votes

Comment puis-je savoir si du code est en cours d'exécution dans un test JUnit ou non ?

Dans mon code, je dois faire certaines corrections uniquement lorsqu'il est exécuté à l'intérieur d'un test JUnit. Comment puis-je savoir si du code est en cours d'exécution dans un test JUnit ou non ? Y a-t-il quelque chose comme JUnit.isRunning() == true ?

83voto

Janning Points 2079

Il pourrait être une bonne idée si vous voulez décider programmatiquement quel "profil" à exécuter. Pensez aux profils de printemps pour la configuration. À l'intérieur d'un test d'intégration, vous voudrez peut-être tester avec une autre base de données.

Voici le code testé qui fonctionne

public static boolean isJUnitTest() {  
  for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
    if (element.getClassName().startsWith("org.junit.")) {
      return true;
    }           
  }
  return false;
}

32voto

Thilo Points 108673

Tout d'abord, ce n'est probablement pas une bonne idée. Vous devriez tester le code de production réel, pas un peu différent.

Si vous voulez vraiment le faire, vous pouvez regarder le stacktrace, mais puisque vous changez votre programme pour cela de toute façon, vous pourriez tout aussi bien introduire un nouveau champ booléen statique isUnitTesting dans votre code, et avoir JUnit réglé sur true. Restez simple.

6voto

SOA Nerd Points 686

Si vous faites les choses différemment parce que vous faites un test unitaire, vous allez à l'encontre de l'objectif d'un test unitaire. Un test unitaire est censé effectuer exactement comme le ferait la production (sauf pour la configuration et le démontage de toutes les données nécessaires et telles que vous en avez besoin....mais cela est inclus dans le test JUnit lui-même et non votre code).

Cependant, si vous avez vraiment une bonne raison pour cela, je regarderais la pile et verrais si JUnit est là.

6voto

Jaime Saiz Points 201

Je peux trouver une justification à cela, c'est quand vous voulez fournir du code dans une classe de production pour aider à tester. Ce serait similaire à l'assertion Java, qui ne s'applique que lorsque le drapeau de débogage est défini.

Quelque chose comme ça :

Object debugState() {
    // This is only meant to be called when testing
    if (!JUnit.isRunning()) {
        throw new IllegalStateException("Not in a test!");
    }
    // Now compute possibly costly debug information
    // not to be used in production
    Object state = ...
}

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