La classe A a une classe intérieure B. Class A possède une liste privée des objets de classe B qu'il rend disponibles via des méthodes GetBS, AddB et Removebb. Comment est-ce que l'unité teste la méthode de removebb?
J'espérais créer deux simulacres égaux de classe B, ajouter chacun, puis retirez-les deux fois (résultant étant de supprimer les deux). Cependant, depuis que j'ai appris à l'échec que la méthode des égaux ne sera pas appelée sur des objets simulés. P>
était idiot (ou impossible) d'essayer d'isoler une classe extérieure de sa classe interne pour des tests d'unité? p>
Le code exemple suit p>
classe à tester: p> cas de test qui n'a pas fonctionné aussi bien: p>
4 Réponses :
Vous pouvez prolonger la classe sous test (A) avec un but rendu à l'Autest Class qui offre une méthode publique qui vous permet de jeter un coup d'œil sur la liste privée de B '/ P>
Pourquoi devez-vous vous moquer de votre classe intérieure? Si j'étais confronté à cette question, j'utiliserais simplement la classe comme cela et testerais que le comportement de la classe extérieure fonctionne comme prévu. Vous n'avez pas besoin de vous moquer de la classe intérieure pour le faire. P>
Afrett: lors du remplacement de la méthode Equals (), il est conseillé de remplacer également la méthode HashCode (). P>
À propos de Equals / HashCode: Il est plus que conseillé de remplacer le hashcode aussi, ce qui ne le fait pas, ne peut pas casser un ou les contrats les plus importants de Java, rendre votre classe inutilisable dans les hachons et générer des bugs étranges au moment de l'exécution.
Plusieurs années trop tardes, mais je pensais que je devrais fournir un raisonnement pour la raison pour laquelle quelqu'un voudrait la simulation: la classe intérieure telle qu'elle est responsable de certains réseau IO qui ne devrait pas se produire dans un environnement de test.
Je ne pense pas que cette réponse a du sens. Il y aura une certaine interaction entre une classe interne et extérieure, et il est évident que cela pourrait avoir besoin de tests. Pourquoi est-ce une réponse acceptée?
Il y a un million de raisons de se moquer d'une classe intérieure à Android.
Premièrement, la réponse à votre question: Oui, c'est généralement une mauvaise idée d'essayer de séparer une classe interne et externe lorsque des tests unitaires. En règle générale parce que les deux sont intimement liés, par exemple interne n'a aucun sens dans le contexte de l'extérieur ou externe a une méthode d'usine qui renvoie une mise en oeuvre d'une interface, une interne. Si les deux ne sont pas vraiment liés, alors séparez-les en deux fichiers. Il facilite votre vie de test.
Deuxièmement, (en utilisant le code ci-dessus comme exemple), vous n'avez pas besoin de se moquer du code ci-dessus. Créez simplement des cas et vous allez. On dirait que vous en avez assez pour travailler. Vous pouvez toujours faire quelque chose comme: p> pas de maquette nécessaire. P> troisièmement, essayez de déterminer ce que vous testez réellement. Dans le code ci-dessus, vous testez que si j'ajoute quelque chose à une liste, je peux le supprimer. Au fait, vous indiquez que s'il existe plusieurs objets qui sont «égaux»; Le code ci-dessus ne fait pas cela, de la définition de Collection # Supprimer () : P> supprime une seule instance de l'élément spécifié de cette
Collection, s'il est présent (opération facultative). Plus formellement,
supprime un élément électronique tel que (O == null? E == null: o.equals (e)), si
Cette collection contient un ou plusieurs éléments de ce type. P>
blockQuote> est-ce vraiment ce que vous voulez tester? p> quatrièmement, si vous implémentez des égaux, implémentez HASHCode également (voir Equals and Hashcode à Java ). P> P>
En tant que TDD NEWB qui vient de rencontrer cette situation pour la première fois, j'ai constaté que je suis arrivé à avoir des classes intérieures «non valables» à la suite du refactoring, et si vous utilisez une approche de TDD «pure», je me demande si vous pourrait se retrouver avec des classes intérieures toute autre manière.
Le problème est que, en supposant que une ou plusieurs références soient apportées à l'objet de la classe externe de la classe intérieure, ce refactoring particulier brisera souvent un ou plusieurs tests. La raison en est assez simple: votre objet mock, si un ... mais Les classes intérieures feront toujours référence à l'objet réel. Il sera donc souvent le cas qui tente d'appliquer des moqueurs sur Étant donné que notre développement de nos tests est un investissement de qualité, il me semble que ce serait Une terrible honte juste de dire: "Ok, je vais juste laisser tomber ce test". p> Je suggère qu'il y a deux options: p> Si vous remplacez l'accès de votre classe intérieure accès em> accès aux champs de classe extérieure avec des méthodes getter / setter (qui peuvent être L'autre possibilité est de refroidir cette classe intérieure pour en faire une classe libre, dont une instance qui remplace votre classe interne et transférant une ou plusieurs méthodes de test à une nouvelle classe de test pour cette nouvelle classe. Vous serez ensuite confronté à la tâche (simple) de gêner les choses de manière à ce que les références à l'objet de la classe externe soient paramétrées (c'est-à-dire 99% des cas, passés en tant que paramètre constructeur), puis peuvent être moqueurs de manière appropriée. Cela ne devrait pas être trop difficile. Bien que vous ayez peut-être besoin d'ajouter des méthodes de getter / setter appropriées pour les champs code> privés de la classe extérieure et / ou de créer un ou plusieurs de ses méthodes code> privées code> en utilisant l'une ou l'autre approche que vous avez subie aucune perte de qualité. p> p> espion code> est en réalité une enveloppe autour d'un objet réel p>
myClass code> ne fonctionnera pas. Pire pire, même sans se moquer, il y a une probabilité élevée que la chose échoue complètement et inexplicablement juste à propos de son entreprise normale. Sachez également que votre espion n'aura pas exécuté la méthode du constructeur réel pour lui-même: beaucoup d'aller mal. P>
privé code>, assez étrangement) cela signifierait que Ce sont les méthodes Mock em> qui seront utilisées ... et donc les champs de la motion. Vos tests existants devraient ensuite continuer à passer. p> li>
package-privé < / code>. À partir de ce point de la classe intérieure devient une "boîte noire" en ce qui concerne le test de la classe extérieure. P> li>
ol>
totalement indépendant, utilisez des classes intérieures statiques si vous n'avez pas besoin d'une référence à la classe extérieure