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 ?
Réponses
Trop de publicités?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;
}
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.
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à.
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 = ...
}