2016-11-23 1 views
2

Je fais ce projet avec GWT et quand je fais le test Junit pour la méthode LogIn, j'obtiens une exception NullPointerException parce que je vérifie la session avec HttpServletRequest.Gwt Junit test HttpServletRequest Nullpointer

Voici le test Junit

private void checkLoginTest() { 

    UsersServiceImpl USI = new UsersServiceImpl(); 

    UserDTO userDTO1 = new UserDTO(); 
    UserDTO userDTO2 = new UserDTO(); 

    User user1 = new User("username1", "password1", "email1", 
      "aa", "aa", "aa", "aa", UserRights.USER); 
    User user2 = new User("username2", "password2", "email2", 
      "aa", "aa", "aa", "aa", UserRights.USER); 

    userDTO1.setUser(user1); 
    userDTO2.setUser(user2); 

    UserDTO insertedUser1 = USI.register(userDTO1); 
    UserDTO insertedUser2 = USI.register(userDTO2); 

    /* 
    * Check login success 
    */ 
    Assert.assertNotNull(USI.checkLogin("username1", "password1")); 
    Assert.assertNotNull(USI.checkLogin("username2", "password2")); 
    //Wrong password below 
    Assert.assertNull(USI.checkLogin("username2", "ciaone")); 

    /* 
    * Check user returned by login 
    */ 
    /*Assert.assertEquals(user1.getUsername(), USI.checkLogin("username1", "password1")); 
    Assert.assertEquals(user2.getUsername(), USI.checkLogin("username2", "password2"));*/ 
} 

Et voici la méthode checkLogin de UsersServiceImpl

public UserDTO checkLogin(String username, String password) { 

    // boolean check = false; 
    UserDTO checkedUser = new UserDTO(); 

    mapDB.begin(); 

    Map<String, User> userMap = mapDB.getDB().createTreeMap("UserMap") 
      .makeOrGet(); 

    if (userMap.containsKey(username)) { 
     // Controllo se la password è corretta per quello username 
     checkedUser.setUser(userMap.get(username)); 

     if (checkedUser.getUser().getPassword().equals(password)) { 
      // check = true; 
      checkedUser.setLogged(true); 
      // Salvo la sessione utente 
      storeUserInSession(checkedUser); 
     } else { 

      checkedUser.setUser(null); 
     } 

    } else { 

     checkedUser.setUser(null); 
    } 

    mapDB.end(); 

    return checkedUser; 
} 

private void storeUserInSession(UserDTO user) { 
    HttpServletRequest httpServletRequest = this.getThreadLocalRequest(); 
    HttpSession session = httpServletRequest.getSession(true); 
    session.setAttribute("user", user); 
} 

Le retour de storeUserInSession nul et je reçois le NullPointerException.

Comment puis-je éviter cela, ou comment puis-je appeler un HttpServletRequest pour une session dans le test Junit?

Ok changé la méthode storeUserInSession avec

private void storeUserInSession(UserDTO user) { 
    //Junit test ritorna NullPointerException 
    //In questo modo funziona 
    try { 
     HttpServletRequest httpServletRequest = this.getThreadLocalRequest(); 
     HttpSession session = httpServletRequest.getSession(true); 
     session.setAttribute("user", user); 
    } catch (Exception e) { 
     System.err.println("Errore creazione HttpServeletRequest"); 
     e.printStackTrace(); 
    } 

} 

Ou peut être bien celui-ci aussi

private void storeUserInSession(UserDTO user) { 

     HttpServletRequest httpServletRequest = this.getThreadLocalRequest(); 
     if(httpServletRequest != null){ 
      HttpSession session = httpServletRequest.getSession(true); 
      session.setAttribute("user", user); 
     } 
} 

Répondre

1

Il différentes solutions à votre problème:

  1. Vous pouvez changer le test devenir un testcase GWT, cela serait exécuté dans le navigateur en tant que JavaScript compilé.
  2. Vous pouvez changer la visibilité de storeUserInSession à protected, dériver de ce Class et changer la méthode pour votre test.
  3. Vous pouvez utiliser un cadre moqueur comme « Powermockito » pour se moquer de la session
  4. Vous pourriez faire storeUserInSession NullPointer sûr et retourner vrai ou faux, si les données ont été stockées.

J'utiliserais la méthode 1 ou 4, car ce serait la manière la plus simple.

La manière la plus élégante est 3, je pense, mais vous auriez besoin d'apprendre un cadre moqueur.

+0

Je suis d'accord avec votre choix, 1 et 4. C'est un projet universitaire, je ne sais pas si je peux utiliser la méthode 3! Je vais essayer la méthode 1 et 4, et quand cela fonctionne je vais vérifier votre réponse ... si je reçois un problème continuer à poster ici ou ouvrir une autre question? (Qu'en penses-tu?) – Dario

+0

Edité avec la solution! Merci pour le soutien! – Dario