Comment simuler une intérieure privée de la classe
J'ai un traitement au printemps et je veux créer un test unitaire sur un contrôleur comme celui-ci. Le problème est que la classe Wrapper est un privé intérieur de la classe, de sorte Wrapper n'est pas compris dans le test. Est-il possible de le simuler avec Mockito sans changer la classe du contrôleur. Je peux utiliser prepareData() pour obtenir une instance de l'objet, mais je ne sais pas si cela pourrait être utilisé pour se moquer de cet objet.
Grâce
@Controller
public class Controller {
private class Wrapper {
private Object1 field1;
private Object2 field2;
private Object1 method1(){
...
}
private Object2 method1(){
...
}
}
@ModelAttribute("data")
public Wrapper prepareData() {
return new Wrapper ();
}
public String save(@ModelAttribute("data") Wrapper wrapper, BindingResult result, Model model){
...
}
}
Donc dans mon test, j'aurais quelque chose comme cela
@Test
public void usernameEmpty(){
BindingResult result = Mockito.mock(BindingResult.class);
Model model = Mockito.mock(Model.class);
Wrapper data = //how to mock it
when(data.method1()).then(new Foo1());
when(data.method2()).then(new Foo2());
String returned = controller.save(data, result, model);
....
}
Ma-je vous demander pourquoi vous voulez faire cela? Vous serez probablement en fin d'essai sur le mauvais code. Si l'intérieur de la classe a des dépendances (probablement obtenus par le contrôleur?) se moquer de ceux. Attendre? Est-ce que votre code de la compilation? Si Wrapper est privé de classe vous pouvez l'utiliser comme un argument à une méthode publique?
Fernandes je suis nouveau dans le test. Je voulais juste faire un test sur la méthode save j'ai donc besoin de se moquer de l'objet Wrapper afin que je puisse définir le retour des objets lors de certaines méthodes sont invoquées. Oui le contrôleur compile (Le test n'est pas, mais c'est le problème - que je ne peux pas utiliser la classe Wrapper dans le test). Peut-être il ya une meilleure façon de le faire.
Java il m'a surpris à nouveau (sur le négatif). Cela me fait impuissante à aider sans un compilateur Java sous la main 🙁 de toute façon, même si c'est permis, je ne pense pas que c'est un bon design afin d'avoir une méthode publique qui nécessite des connaissances de soldats. Il rompt l'encapsulation. Comment allez-vous utiliser cette méthode dans le vrai code? Est-il possible?
Fernandes vous avez raison je pense que je vais le changer pour le public
ou utiliser ma réponse 😉
Fernandes je suis nouveau dans le test. Je voulais juste faire un test sur la méthode save j'ai donc besoin de se moquer de l'objet Wrapper afin que je puisse définir le retour des objets lors de certaines méthodes sont invoquées. Oui le contrôleur compile (Le test n'est pas, mais c'est le problème - que je ne peux pas utiliser la classe Wrapper dans le test). Peut-être il ya une meilleure façon de le faire.
Java il m'a surpris à nouveau (sur le négatif). Cela me fait impuissante à aider sans un compilateur Java sous la main 🙁 de toute façon, même si c'est permis, je ne pense pas que c'est un bon design afin d'avoir une méthode publique qui nécessite des connaissances de soldats. Il rompt l'encapsulation. Comment allez-vous utiliser cette méthode dans le vrai code? Est-il possible?
Fernandes vous avez raison je pense que je vais le changer pour le public
ou utiliser ma réponse 😉
OriginalL'auteur Javi | 2011-04-08
Vous devez vous connecter pour publier un commentaire.
Votre test est sur les méthodes, mais il teste l'ensemble du comportement de la classe. Si l'intérieur de votre classe est privée, c'est un détail d'implémentation. Quelque chose que le test ne devrait pas savoir. Il y a beaucoup de savoir que l'intérieur de la classe et vous souhaitez le tester de manière indépendante peut-être vous devriez le rendre public et séparée de cette classe.
Vous pensez peut-être: mais alors... c'est beaucoup de code de test (un très grand indivisible chose), je ne peux pas tester quelque chose de plus petit? Eh bien... oui. Développement Piloté par les tests mandats de faire un minimum de mise en œuvre et d'ajouter plus de code uniquement si vous ajoutez plus de tests. Vous commencez donc avec quelques test et un minimum de mise en œuvre et de faire évoluer les deux d'entre eux jusqu'à ce que les tests ont toutes les spécifications et le code de la mise en œuvre.
Donc ne vous inquiétez pas privée les classes internes. Testez votre classe contrat!
Il n'est pas très bonne, elle sera d'un test d'intégration. Vous avez cassé l'un des grands principes de développement piloté par les tests - test devrait être simple!
Oui. Mais TDD est une méthodologie de développement: premier test d'écriture, puis écrire le code. Dans ce cas, l'OP peut-être obtenir un autre modèle (plus simple et plus modulaire), et de ne pas obtenir un privé intérieur de la classe. Dans cette situation, il est seulement le test d'un code déjà existant. Dit: je suis d'accord c'est pas un test simple mais un privé intérieur de la classe n'est pas extractible à partir de la classe de conteneur si bien qu'il n'est pas simple, ce n'est pas un test d'intégration à mon humble avis (de toute façon, l'important, c'est "test" 🙂
Je ne le pense pas. Exemple: si le fichier élabore des renseignements qu'il exige parfois de cache interne, généralement, il peut être fait comme privé intérieur de la classe.
OriginalL'auteur helios