Question

Je suis nouveau sur jmock et j'essaie de me moquer d'une session HTTP. Je reçois:

java.lang.AssertionError: appel inattendu: httpServletRequest.getSession () aucune attente spécifiée: avez-vous ...  - oublier de commencer une attente avec une clause de cardinalité?  - appeler une méthode simulée pour spécifier le paramètre d’une attente?

la méthode de test:

@Test

public void testDoAuthorization(){

    final HttpServletRequest request = context.mock(HttpServletRequest.class);
    final HttpSession session = request.getSession();

    context.checking(new Expectations(){{
       one(request).getSession(true); will(returnValue(session));
   }});

    assertTrue(dwnLoadCel.doAuthorization(session));
}

J'ai fait quelques recherches et je ne vois toujours pas comment cela se fait. On se sent comme il me manque un petit morceau. Toute personne ayant de l'expérience dans ce domaine peut me diriger dans la bonne direction. merci

Était-ce utile?

La solution

Vous n'avez pas besoin de simuler l'objet requête. Étant donné que la méthode que vous testez ( dwnLoadCel.doAuthorization () ) ne dépend que d'un objet HttpSession , vous devez vous moquer de cela. Donc, votre code ressemblerait à ceci:

public void testDoAuthorization(){
    final HttpSession session = context.mock(HttpSession.class);

    context.checking(new Expectations(){{
        // ???
    }});

    assertTrue(dwnLoadCel.doAuthorization(session));

}

La question est la suivante: qu'espérez-vous que le SE sous fasse avec l'objet de session? Vous devez exprimer dans vos attentes les appels à la session et les valeurs de retour correspondantes supposées générer doAuthorization renvoyer true .

Autres conseils

Je pense que vous devez indiquer au contexte JMock combien de fois vous attendez à ce que la méthode soit appelée avant de poursuivre et de l'appeler.

final HttpServletRequest request = context.mock(HttpServletRequest.class);

context.checking(new Expectations(){{
  one(request).getSession(true); will(returnValue(session));
}});

final HttpSession session = request.getSession();

Je ne connais pas très bien JMock, mais vous souciez-vous réellement dans votre test unitaire dwnLoadCel combien de fois certaines méthodes de l'objet simulé sont appelées? Ou essayez-vous simplement de tester votre classe qui dépend d’une session HttpSession sans session réelle? Si c’est le dernier cas, je pense que JMock est excessif pour vous.

Vous pouvez envisager de créer vous-même une classe qui implémente l'interface HttpSession à des fins de test unitaire uniquement (un stub) et d'exécuter vos tests à partir de cela, ou vous devriez Examinez dwnLoadCel et déterminez s’il a vraiment besoin d’une référence à la session HttpSession ou s’il a simplement besoin de propriétés dans la session Http. Le refactor dwnLoadCel ne dépend que de ce dont il a réellement besoin (une Carte ou une certaine valeur de paramètre dans l'objet Session) - cela facilitera le test de votre unité (la dépendance du le conteneur de servlet passe au revoir).

Je pense que vous avez déjà testé un certain niveau d'injection de dépendance dans votre classe, mais que vous êtes peut-être dépendant d'un objet trop large. Le blog de test Google a eu beaucoup d’excellent articles sur DI récemment que vous pourriez trouver utiles (j'en ai bien sûr).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top