Pourquoi junit ComparisonFailure n’est pas utilisé par assertEquals (Object, Object)?

Dans Junit 4, voyez-vous un inconvénient à lancer un ComparisonFailure au lieu d’un AssertionError cas de défaillance de assertEquals (Object, Object)?

assertEquals (Object, Object) jette

  • un ComparisonFailure si les valeurs attendues et réelles sont des chaînes
  • une AssertionError si ce n’est pas une chaîne

AssertionError message AssertionError est déjà de la forme

 "expected: but was <"+ actual.toString() 

(via Ssortingng.valueOf , voir ci-dessous la méthode junit-4.8.2 appelée par Assert.assertEquals (Object, Object) pour créer le message AssertionError):

 static Ssortingng format(Object expected, Object actual) { ... Ssortingng expectedSsortingng= Ssortingng.valueOf(expected); Ssortingng actualSsortingng= Ssortingng.valueOf(actual); ... return formatted+"expected: but was:"; 

ComparisonFailure fournit un moyen beaucoup plus lisible de repérer les différences dans la boîte de dialog d’éclipse ou d’ Intellij IDEA (FEST-Assert lève cette exception)

[Mise à jour: question modifiée pour se concentrer sur la discussion ComparisonFailure / AssertionError.]

Nous avons commencé par comparer les chaînes car il était évident de rendre le message d’erreur plus utile. Nous n’avons jamais étendu ComparisonFailure à des objects généraux car il n’était pas clair comment procéder de manière générale. Comme d’autres l’ont suggéré, n’hésitez pas à append des assertions spéciales si vous pouvez fournir de meilleurs messages d’erreur ou passer à Hamcrest, qui fournit un mécanisme général pour append des messages d’échec utiles.

Cordialement,

Kent

Je pense que vous pouvez certainement écrire votre propre méthode substitut assertEquals pour le faire sans aucun problème significatif, si cela vous convient.

Cependant, dans le cas général (du sharepoint vue des développeurs de framework), est-ce une bonne idée, je ne suis pas sûr. Souvent, les objects en échec n’auront pas d’implémentation toSsortingng, le message d’échec de l’EDI étant alors très trompeur. Vous auriez l’impression que la comparaison portait sur l’identité de référence, alors que ce n’était peut-être pas le cas.

En d’autres termes, il est utile que les objects aient une implémentation toSsortingng significative, sinon ce n’est peut-être pas le cas.

Je suis d’accord avec l’implémentation actuelle de JUnit, avec deux classes d’exception. Principalement parce que cela nous permet de différencier les problèmes de comparaison ( ComparisonFailure ) des problèmes d’incompatibilité de type “plus graves” ( AssertionError ).

En général, un message texte à l’intérieur d’une Exception est juste une aide pour un être humain et n’est pas destiné à être touché par aucun outil logiciel. C’est pourquoi le type d’exception levée est le seul indicateur du problème survenu.