9
votes

Comment utiliser des contrôleurs de test qui utilisent SpringSecurityService?

J'ai une classe d'utilisateur comme telle:

defineBeans {
    springSecurityService(SpringSecurityService)
}


1 commentaires

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.


4 Réponses :


0
votes

J'ai fait cela comme ceci: xxx


1 commentaires

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)



8
votes

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 ...

  1. La réponse ci-dessus fonctionnera, mais comme je l'ai dit, je ne préférerais personnellement pas
  2. Ne pas tester l'unité. Écrivez tous vos tests qui rencontrent cette situation en tant que tests d'intégration.
  3. Mockez-le avec un faux service.

    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. xxx

    maintenant lorsque le springsecurityservice.encodepassword est invoqué il doit renvoyer "coded_password". Je crée également un objet au lieu d'instantifier un nouveau Springsecurityservice 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.


1 commentaires

Bonne réponse! Btw j'ai corrigé la ligne "service.metaclass.encodepassword =" à "springsecurityservice.metaclass.encodepassword ="



-1
votes

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): xxx

aucune idée de pourquoi ai-je besoin de cela?


0 commentaires

0
votes

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. XXX PRE>

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
}


0 commentaires