Je veux tester mon contrôleur MVC printemps.
Le contrôleur a un service: p> et mon service utilisateur dépend de mon userDao et d'autres autres services comme Mongodb etc. P> Maintenant, je veux que la logique commerciale soit testée dans mon userservice, mais que je veux me moquer des réponses de mon userDao et mongodb, etc. P> Comment puis-je Configurer le test de mon appareil correctement? p> puis-je réutiliser le fichier XML du conteneur de ressort qui a toutes mes haricots, etc. Ou dois-je créer un nouveau? STRUT> (je suppose Je dois obtenir le conteneur de printemps impliqué ici) p> à la recherche de quelques conseils à ce sujet, tout didacticiel serait grandement apprécié. P> Mise à jour b> P> P> P> Ce que je trouve étrange, c'est que pour mon contrôleur de printemps (qui ne s'applique pas à un contrôleur), j'ai pu accéder à ma variable privée pour définir manuellement mon service, c'est-à-dire: P> UserService userService = new UserServiceImpl();
userService.userDao = .... // not available
3 Réponses :
Cadre de printemps a des fonctionnalités très intéressantes pour les tests. Vous pouvez jeter un coup d'œil à Guide de référence du ressort . Il peut fournir à votre classe de test Junit. brièvement, vous pouvez utiliser votre propre applicationContext.xml em> ou même définir un nouveau pour tester. J'utilise personnellement un différent depuis que je définis une autre source de données dédiée à des fins de test. P> P>
Ce que je trouve étrange, c'est que pour mon contrôleur de printemps (qui ne s'applique pas à un contrôleur), j'ai pu accéder à ma variable privée pour définir manuellement mon service, c'est-à-dire: p> blockQuote>
Ceci est facile: la variable en non privée. P>
Il a la visibilité par défaut ("package privé"). Cela signifie que vous pouvez y accéder de toutes les classes du même paquet. P>
Donc, si vous avez une structure commune, le contrôleur et le boîtier de test du contrôleur sont dans le même paquet. Par conséquent, vous pouvez modifier les champs de contrôleur ("package privé"). Mais le boîtier de test du contrôleur et le service ne sont pas dans le même emballé, vous ne pouvez donc pas accéder aux champs de service ("Package privé"). P>
Puis-je réutiliser le fichier XML du conteneur de ressort qui a tous mes haricots Et etc. Ou je crée un nouveau? (Je suppose que je dois avoir le printemps conteneur impliqué ici) p> blockQuote>
Je conseillerais de créer un nouveau fichier XML. Vous finiriez par faire dupliquer beaucoup de choses et c'est difficile à maintenir. Il y aurait une prolifération de fichiers de configuration. Vous mettez la configuration requise pour les tests dans un fichier XML différent et qui ne doit même pas être déployé dans votre boîte de production. En ce qui concerne l'utilisation de la configuration pour vos haricots, vous pouvez utiliser le mécanisme comme suggéré par @trein. P>
Pour tester le printemps Control en général, vous pouvez également trouver ce Si le fil utile. P>
espère que cela aide. P>
Re: Mise à jour, quels packages sont le contrôleur, le service et les tests? Si le test est dans le même package, il peut accéder aux propriétés par défaut. Omission d'un modificateur d'accès pas i> créer une propriété privée, plutôt paquet-privé .
Je les ai dans le même paquet. Ahh je vois, j'ai supposé que c'était privé. Je me demandais pourquoi Intellij lors d'un refacteur fait des champs privés par défaut. Donc, je devrais les garder comme paquet privé alors?
Il n'y a pas de "devrait", cela dépend juste. Mon seul préoccupation avec le forfait-privé est que vous pourriez toujours accéder à quelque chose de non involontaire; J'ai tendance à préférer garder les choses privées et utiliser des setters, mais meh.
En fait, mon userserviceImpl est dans com.abc.services et mon contrôleur est dans com.abc.web.Controlers et mon test de l'unité pour le contrôleur est dans com.abc.web.Controlers, c'est pourquoi cela fonctionne pour mon contrôleur et non le service à droite? a du sens maintenant.
Oui, c'est ce que j'ai fait, j'ai mis toutes ces personnes injectées Dao, etc. dans mon userservice avec des setters. Je n'aime pas écrire de code juste pour faciliter les tests..oh bien. Je suppose que l'autre sens serait d'utiliser une injection dans mes tests en quelque sorte.
@Blankman: Vous devriez annoter les Setters avec AutoWired pour effectuer une injection d'utilisation à ressort ou une injection de champ. Ou, comme je préfère même, vous devez utiliser l'injection de constructeur et annoter le constructeur avec AutoWired. Cela rend toutes les dépendances évidentes, permet aux champs finaux et aux services immuables, facilitent le refactoring et n'a pas besoin de setters.
Les champs finaux sont bons pour quoi? performance?