2009-06-30 4 views
2

J'ai une méthode dans une classe qui écrit dans une chaîne, qui appelle une autre méthode qui fait la même chose. Quelque chose comme:Comment bouter une méthode individuelle dans Java pour les tests unitaires?

void foo() { 
    a += "xyx"; 
    bar(); 
} 

void bar() { 
    a += "abc"; 
} 

Aux fins de tests unitaires, je veux tester foo et bar séparément. Est-il possible d'empêcher l'exécution de la barre lorsque j'appelle foo() ou de la remplacer par une autre méthode?

Répondre

8

Créez une sous-classe qui remplace la barre() qui ne fait rien.

+0

À quoi ressemblerait le code client? Comment instanciez-vous la classe qui remplace maintenant bar(). Donc, vous devrez changer le code (ou l'usine) qui instancie la nouvelle classe. Comme je l'ai dit plus bas, je pense que nous avons besoin de plus de détails sur le problème, en particulier, la source peut-elle être modifiée? –

+0

Si vous décidez de le faire, sachez que votre test testera quelque chose de légèrement différent de la classe qu'il est supposé tester. Cela peut entraîner des trous dans votre couverture de test. – NamshubWriter

+0

@AdrianMouat S'il s'agit d'un test unitaire, nous devrions pouvoir supposer que nous pouvons créer la classe qui est testée entièrement séparément. Si oui, nous devrions être en mesure de faire simple: new Clazz() {/ * put override ici * /} Cela signifie que la source n'a pas besoin d'être modifiée – Egwor

1

Pourquoi voudriez-vous faire cela?

Vous pourriez intercepter le code au niveau du code octet en utilisant des aspects (pas sage); vous pouvez prendre un objet qui appelle la barre: void foo(MyBarObject m) { a += "xyx"; m.bar(); }

Mais, comme je l'ai dit, je ne vois pas pourquoi cela est utile. Un test unitaire est destiné à tester une interface publique. Si bar() est privé ou protégé, alors il est testé automatiquement via votre appel, et les assertions suivantes, sur foo(). Si les deux foo() et bar() sont publics, cool, testez-les séparément.

Pouvez-vous poster un vrai exemple? Pouvez-vous changer le code sous test? Etc

1

On pourrait argumenter que l'exemple ci-dessus n'est pas un code testable. Au lieu de cela, si le code était:

void foo() { 
    a += "xyx"; 
} 

void bar() { 
    a += "abc"; 
} 

void fooBar() { 
    foo(); 
    bar(); 
} 

il serait facile de tester unitaire.

Questions connexes