2016-11-23 4 views
2

Я делаю этот проект с GWT, и когда я делаю тест Junit для метода Login, я получаю исключение NullPointerException, потому что я проверяю сеанс с HttpServletRequest.Gwt Junit test HttpServletRequest Nullpointer

Здесь тест 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"));*/ 
} 

А вот метод checkLogin из 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); 
} 

storeUserInSession возвращение утратившим я получаю NullPointerException.

Как я могу избежать этого или как я могу вызвать HttpServletRequest для сеанса в тесте Junit?

Ok изменил метод storeUserInSession с

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(); 
    } 

} 

Или может быть хорошо это один слишком

private void storeUserInSession(UserDTO user) { 

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

ответ

1

Там различные решения вашей проблемы:

  1. Вы можете изменить тест стать тестовым тестом GWT, это будет запущено в браузере как скомпилированный JavaScript.
  2. Вы можете изменить видимость storeUserInSession на protected, исходя из этого Class и изменить метод для вашего теста.
  3. Вы можете использовать насмешливый рамки, как «Powermockito» издеваться На сессии
  4. Вы могли бы сделать storeUserInSession NullPointer безопасным и возвращать истинным или ложным, если данные были сохранены.

Я использовал бы путь 1 или 4, потому что это было бы самым простым способом.

Самый элегантный способ - 3, я думаю, но вам нужно будет изучить насмешливую структуру.

+0

Я согласен с вашим выбором, 1 и 4. Это университетский проект, который я не знаю, могу ли я использовать метод 3! Я попробую метод 1 и 4, и когда он сработает, я проверю ваш ответ ... если я получу какую-то проблему, продолжайте публиковать здесь или открывать другой вопрос? (как вы думаете?) – Dario

+0

Отредактировано решение! Спасибо за поддержку! – Dario