Se moquant de Java enum pour ajouter une valeur de test en cas d'échec

J'ai un enum basculer plus ou moins comme ceci:

public static enum MyEnum {A, B}

public int foo(MyEnum value) {
    switch(value) {
        case(A): return calculateSomething();
        case(B): return calculateSomethingElse();
    }
    throw new IllegalArgumentException("Do not know how to handle " + value);
}

et j'aimerais avoir toutes les lignes couvertes par les tests, mais comme le code est prévu pour faire face à toutes les possibilités, je ne peux pas fournir une valeur sans son correspondant en cas de déclaration dans le commutateur.

L'extension de l'enum pour ajouter une valeur supplémentaire n'est pas possible, et juste se moquer de la méthode equals pour revenir false ne fonctionne pas, soit parce que le bytecode généré utilise un saut de la table de derrière les rideaux pour aller à la appropriée des cas... Donc j'ai pensé que peut-être un peu de magie noire pourrait être réalisé avec des PowerMock ou quelque chose.

Merci!

modifier:

Que je possède de cette énumération, j'ai pensé que je pourrais juste ajouter une méthode à les valeurs, et ainsi d'éviter le commutateur problème complètement; mais je pars de la question qu'il est encore intéressant.

  • le code qui s'exécute l'instruction switch() java throws java.lang.Erreur arrayindexoutofbounds ... j'ai ce même Problème. Exécutez votre test avec une nouvelle énumération que le premier dans votre Classe de Test. J'ai créé un bug avec ce Problème: code.google.com/p/powermock/issues/detail?id=440
  • Il fonctionne mieux lorsque j'utilise @PrepareForTest(MyEnum.class) au niveau de la Méthode.
  • Un IlegalArgument qui ne peut jamais être jeté, car il est évident propriétés de l'enum, mais vous bastardise votre code de test qu'il va gérer l'impossible? Si vous voulez vraiment fetishise votre ligne civerage métrique, pourquoi ne pas simplement supprimer la ligne qui ne peut jamais être exécuté?
  • 2 raisons: tout d'abord, quelqu'un d'autre pourrait créer une nouvelle valeur de l'enum et oublier d'ajouter un nouveau cas pour le commutateur; deuxièmement, le code ne compile pas sans throw ou return après le changement.
  • Après réflexion, je pense juste laisser pas été testé. Il n'y a pas illégal valeur d'enum pour le déclenchement de l'Exception et il est douloureux de se moquer. Je pense que le jet est bon, c'est l'avenir, vraiment dur à tester. Pas la peine de l'effort de test, à mon humble avis.
InformationsquelleAutor fortran | 2011-03-16