J'ai une classe d'utilisateur comme telle:
defineBeans { springSecurityService(SpringSecurityService) }
4 Réponses :
J'ai fait cela comme ceci:
Ce n'est pas une solution idéale, ressemble plus à une solution pour que les tests soient passés. Et si le service de sécurité est annulé pour une raison quelconque de la production ... alors tous vos mots de passe ne sont pas hachés (sans message d'erreur)
Je n'aime personnellement pas ajouter de logique au code de production pour aider à satisfaire un test. Parfois, vous devez prendre une décision sur ce qui est préférable de faire. Couple d'options ...
Si ce code (ou code qui fonctionne dans le même problème) est saupoudré tout au long de votre application, vous voudrez probablement trouver un moyen de se moquer de ces appels dans vos tests de tests pour tous les cas de test afin Vous n'êtes pas duplication de vos efforts d'installation partout. Un moyen facile de se moquer de cela est avec la métaclassique. P> maintenant lorsque le springsecurityservice.encodepassword code> est invoqué il doit renvoyer "coded_password". Je crée également un objet
code> au lieu d'instantifier un nouveau
Springsecurityservice code> car si vous instanciez un service réel, vous pouvez finir par appeler des méthodes réelles sur ce service de manière inattendue et sans le savoir et à avoir vos tests passer pour les mauvaises raisons. Je préfère obtenir une erreur de méthode non aussi qu'un test de passage qui ne devrait pas passer. P> p>
Bonne réponse! Btw j'ai corrigé la ligne "service.metaclass.encodepassword =" à "springsecurityservice.metaclass.encodepassword ="
Dans mon cas, j'ai essayé de remplacer la mise en œuvre de la codepassword de secuser - qui appelle des appels SpringsecurityService.encodepassword ().
J'ai été surpris parce que j'avais besoin de remplacer la classe et l'instance (si je n'ai remplacé ni échoue): p> aucune idée de pourquoi ai-je besoin de cela? p> p>
Je pense que la bonne chose à faire est de se moquer du service. Vous voudrez tester les différents cas qui peuvent être la valeur de retour et que la valeur correcte est transmise à la méthode de service. ou P> @Test
public void something() {
def user = ...
def expectedPassword = 'mock encoded pass'
def mockSecurityService = mockFor(SpringSecurityService)
mockSecurityService.demand.encodePassword { String passwd -> return expectedPassword}
controller.springSecurityService = mockSecurityService.createMock()
...
mockSecurityService.verify() // throws exception if demands aren't met
}
Je rencontre exactement le même problème. Pour autant que je sache, définir desbures () devrait fonctionner, selon la documentation. Malheureusement, cela n'a aucun effet.