2016-11-23 163 views
2

我正在用GWT做这个项目,当我为LogIn方法进行Junit测试时,我得到一个NullPointerException,因为我用HttpServletRequest检查会话。Gwt Junit测试HttpServletRequest空指针

这里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"));*/ 
} 

在这里,从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返回NULL方法checkLogin和我得到的NullPointerException异常。

如何避免这种情况,或者如何在Junit测试中为会话调用HttpServletRequest?

好的改变了方法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安全并返回true或false,如果数据存储。

我会使用方式1或4,因为这将是最简单的方法。

我觉得最优雅的方式是3,但是你需要学习一个模拟框架。

+0

我同意你的选择,1和4. 这是一个大学项目,我不知道我是否可以使用方法3! 我会尝试方法1和4,当它工作时,我会检查你的答案...如果我遇到一些问题,请在此处张贴或打开另一个问题? (你觉得怎么样?) – Dario

+0

用解决方案编辑!感谢您的支持! – Dario