J'écris des tests JUnit qui vérifient qu'une exception de type MyCustomException
est levée. Cependant, cette exception est enveloppée dans d'autres exceptions un certain nombre de fois, par ex. dans une exception InvocationTargetException, qui à son tour est enveloppée dans une exception RuntimeException.La meilleure façon de vérifier si un certain type d'exception était la cause (d'une cause, etc ...) dans une exception imbriquée?
Quelle est la meilleure façon de déterminer si MyCustomException a provoqué l'exception que j'ai réellement détectée? Je voudrais faire quelque chose comme ceci (voir souligné):
try { doSomethingPotentiallyExceptional(); fail("Expected an exception."); } catch (RuntimeException e) { if (!e.
wasCausedBy(MyCustomException.class) fail("Expected a different kind of exception."); }
Je voudrais éviter d'appeler getCause()
quelques « couches » profondes, et similaires contournements laid. Y a-t-il une meilleure façon?
(Apparemment, le printemps est NestedRuntimeException.contains(Class), qui fait ce que je veux - mais je ne suis pas avec Spring.)
FERMÉ: OK, je suppose qu'il n'y a vraiment pas de se déplacer d'une méthode utilitaire :-) Merci à tous ceux qui ont répondu!
Notez que cet algorithme peut provoquer une boucle infinie si la cause est une boucle, ce qui peut se produire dans certains cas comme les exceptions DB EclipseLink. [Apache Commons Lang ExceptionUtils :: getRootCause] (https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/exception/ExceptionUtils.html#getRootCause (java. lang.Throwable)) gère ce cas, donc probablement 'indexOfThrowable' de la réponse de Patrick le fait aussi. – DavidS
@DavidS Pas une boucle infinie - elle lancerait rapidement 'StackOverflowError'. Si vous avez une rupture de causalité comme ça alors vous avez des problèmes plus importants (essayant probablement de réutiliser des objets d'exception même s'ils sont étrangement mutables). –
Un StackOverflowError alors, merci. Quoi qu'il en soit, ce n'est pas un problème avec le code que j'ai écrit; C'est un problème dans certaines bibliothèques communes, y compris certains pilotes Oracle JDBC. C'est un problème assez commun qu'Apache Commons a choisi de gérer dans 'getRootCause', Oracle a choisi de le gérer dans [printStackTrace] (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6962571), et Gava envisagé de le traiter dans [Throwables] (https://github.com/google/guava/issues/1173). Mon commentaire était destiné à avertir de cela, ne recommande pas la meilleure façon de construire des exceptions. – DavidS