2009-07-17 7 views
3

Je crois que vous devez être au courant de cet idiome, qui est en quelque sorte l'excuse de java pour les fermeturesComment tester les cours anonymes?

//In the "Resource Manager" class 
public void process(Command cmd){ 
    //Initialize 
    ExpensiveResource resource = new ExpensiveResource(); 
    //Use 
    cmd.execute(resource); 
    //Release/Close 
    resource.close(); 
} 

//In the Client class... 
manager.process(new Command(){ 

    public void execute(ExpensiveResource res){ 
    //Do things with the resource 
    } 
}); 

je cet idiome/modèle beaucoup mais recently I tried to test it, et il me donne un mal de tête ...

Comment tester isolément les classes ResourceManager et Client? J'ai trouvé que ça les couples tellement que vous ne pouvez pas le faire facilement.

Les idées sont appréciées.

Cordialement

Répondre

1

Si vous ne voulez pas faire du type anonyme un type réel que vous pouvez tester, pensez à déplacer le code dans sa fonction execute() vers une autre fonction que vous pouvez tester. Le type anonyme devient alors un humble objet (http://xunitpatterns.com/Humble%20Object.html).

éditez mais vous devriez continuer à trouver un moyen de tester le code dans la fonction anonyme.

Dans un langage de typesafe tel que C#, cela peut être fait en demandant au code anonyme d'appeler une fonction de membre virtuel. Le test spécialise la classe en remplaçant l'appel de fonction virtuelle, en vérifiant qu'il est appelé.

Dans un langage non-sécurisé tel que Javascript, la fonction membre appelée est déjà virtuelle. Ainsi, plutôt que de créer un type dérivé, vous pouvez écraser la fonction membre appelée avec une version enregistrée.

0

Ne pas utiliser les classes internes anonymes beaucoup (le cas échéant). En plus d'être difficiles à tester, ils sont pratiquement impossibles à réutiliser sans copier-coller.

La plupart du temps, les classes complètes permettent plus de flexibilité et améliorent votre design OO (ajouter plus de classes améliore presque toujours votre design). Par ailleurs, comme vous l'avez mentionné les fermetures ont également le même problème - difficile à réutiliser.

+3

Si les fermetures entraînent moins de réutilisation de code (plutôt que plus) dans votre code, vous les utilisez mal; mais il n'y a rien de mal à leur sujet en tant que tel. En fait, tout cadre centré autour des fermetures entraîne généralement une augmentation spectaculaire de la réutilisation du code (parce que vous pouvez réutiliser les mêmes algorithmes avec des prédicats différents, etc.). Idem pour les cours anonymes. –

+0

Je suis avec Pavel ... Je manque vraiment les fermetures tout en travaillant en Java –

+1

S'il vous plaît expliquer comment l'objet que vous passez en tant que fermeture peut être réutilisé. Je peux écrire un code OO droit pour réutiliser autant qu'une fermeture, mais je n'arrive pas à comprendre comment réutiliser ce mot que je passe, mais c'est peut-être là que les fermetures sont supérieures aux classes internes anonymes - je les utilise régulièrement et peut vous dire qu'il n'y a pratiquement aucun moyen de réutiliser le code que vous transmettez anonymement. –

5

Je pense que les classes anonymes devraient être si petites et simples que le test de la structure les incluant/les utilisant devrait être assez bon.

Si vous avez quelque chose de tellement compliqué, gros, important que vous ressentez le besoin de le tester, faites-en un classe complète.