Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试使用数据库登录的Servlet?_Java_Unit Testing_Junit_Mockito_Jmockit - Fatal编程技术网

Java 如何测试使用数据库登录的Servlet?

Java 如何测试使用数据库登录的Servlet?,java,unit-testing,junit,mockito,jmockit,Java,Unit Testing,Junit,Mockito,Jmockit,大家好,我想用mocκito或JUNIT测试这段代码 //登录Servlet @WebServlet("/login_controller") public class login_controller extends HttpServlet { private static final long serialVersionUID = 1L; private String TAG="Login controller : "; private DataSource dataS

大家好,我想用mocκito或JUNIT测试这段代码

//登录Servlet

 @WebServlet("/login_controller")
public class login_controller extends HttpServlet {
private static final long serialVersionUID = 1L;

    private String  TAG="Login controller : ";
    private DataSource dataSource;
    private Connection connection;


    public void init() throws ServletException {
        connection=null;
        try {
            // Get DataSource
            Context initContext  = new InitialContext();
            Context envContext  = (Context)initContext.lookup("java:/comp/env");
            dataSource = (DataSource)envContext.lookup("jdbc/db");


        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

/**
 * @see HttpServlet#HttpServlet()
 */
public login_controller() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doPost(request,response);
//  response.getWriter().append("Served at: ").append(request.getContextPath());
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
//  doGet(request, response);
     response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    String userName=null;
    String password=null;
    boolean user_found= false;

    //Get parameters From HTTP request
    userName = request.getParameter("username");
    password = request.getParameter("password");


    if(userName == null || password ==null ||userName.equals("")||password.equals("")){
        System.out.println(TAG + "Username or Password =  Empty strings");
        RequestDispatcher rs = request.getRequestDispatcher("index.jsp");
           rs.forward(request, response);
           return;

    }
    System.out.println(TAG+"Username :" + userName+ "\t Password :"+password);
    System.out.println(TAG+"Remote IP address is " + request.getRemoteAddr());

    //Log USER loggin attempt
    LOG_IP_USER log =new LOG_IP_USER();
    USERS_DB user   =new USERS_DB();


    try {
        connection = dataSource.getConnection();
        user_found=user.authenticate(connection, userName, password);

    }
    catch (NoSuchAlgorithmException | SQLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    finally
      {
          try { if(null!=connection)connection.close();} catch (SQLException e) 
          {e.printStackTrace();}
      }


      if(user_found)//User found in the database
        {
          log.log(request.getRemoteAddr(),userName,true);  
          System.out.println(TAG + "Username"+userName);

           Cookie userNameCookie=new Cookie("username",userName);
            userNameCookie.setMaxAge(60*15);//15 minutes
            response.addCookie(userNameCookie);
            response.sendRedirect("userChoice.jsp"); 
            return;
        }
        else
        {   
            log.log(request.getRemoteAddr(),userName,false);
            out.println ("<script>alert('Invalid Username Or Password!');</script>");
           RequestDispatcher rs = request.getRequestDispatcher("index.jsp");
           rs.include(request, response);
        }




}
@WebServlet(“/login\u controller”)
公共类登录\u控制器扩展HttpServlet{
私有静态最终长serialVersionUID=1L;
私有字符串TAG=“登录控制器:”;
私有数据源;
专用连接;
public void init()引发ServletException{
连接=空;
试一试{
//获取数据源
Context initContext=新的InitialContext();
Context-envContext=(Context)initContext.lookup(“java:/comp/env”);
dataSource=(dataSource)envContext.lookup(“jdbc/db”);
}捕获(NamingE例外){
e、 printStackTrace();
}
}
/**
*@参见HttpServlet#HttpServlet()
*/
公共登录\u控制器(){
超级();
//TODO自动生成的构造函数存根
}
/**
*@参见HttpServlet#doGet(HttpServletRequest请求,HttpServletResponse响应)
*/
public void doGet(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//TODO自动生成的方法存根
doPost(请求、响应);
//response.getWriter().append(“服务于:”).append(request.getContextPath());
}
/**
*@请参阅HttpServlet#doPost(HttpServletRequest请求,HttpServletResponse响应)
*/
public void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{
//TODO自动生成的方法存根
//doGet(请求、响应);
response.setContentType(“text/html”);
PrintWriter out=response.getWriter();
字符串userName=null;
字符串密码=null;
布尔用户_found=false;
//从HTTP请求获取参数
userName=request.getParameter(“用户名”);
password=request.getParameter(“密码”);
如果(userName==null | | password==null | | userName.equals(“”)| | password.equals(“”){
System.out.println(标记+“用户名或密码=空字符串”);
RequestDispatcher rs=request.getRequestDispatcher(“index.jsp”);
转发(请求、响应);
返回;
}
System.out.println(标记+“用户名:”+Username+“\t密码:”+Password);
System.out.println(标记+“远程IP地址为”+request.getRemoteAddr());
//日志用户登录尝试
LOG_IP_USER LOG=新日志_IP_USER();
用户\数据库用户=新用户\数据库();
试一试{
connection=dataSource.getConnection();
user\u found=user.authenticate(连接、用户名、密码);
}
catch(nosuchagorithmexception | SQLException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
最后
{
尝试{if(null!=connection)connection.close();}catch(SQLException)
{e.printStackTrace();}
}
if(user\u found)//在数据库中找到用户
{
log.log(request.getRemoteAddr(),用户名,true);
System.out.println(标记+用户名+用户名);
Cookie userNameCookie=新Cookie(“用户名”,用户名);
userNameCookie.setMaxAge(60*15);//15分钟
addCookie(userNameCookie);
sendRedirect(“userChoice.jsp”);
返回;
}
其他的
{   
log.log(request.getRemoteAddr(),用户名,false);
out.println(“警报('无效用户名或密码!');”;
RequestDispatcher rs=request.getRequestDispatcher(“index.jsp”);
包括(请求、响应);
}
}
}

如果在数据库中找到用户,则user.authenticate方法返回true。 log.log(记录用户的ip地址和成功或失败)
有人能帮我做测试吗。

单元测试不能在涉及数据库交互的代码上进行。这些都在集成测试中涉及。但是,如果您想在JUnit测试中测试这一点,那么您可以模拟连接并返回值,以使用
JMockit/Mockito
测试场景

//sample code using JMockit
@Test
public void testMyMethod(@Mocked final USERS_DB user){

new Expectations(){
             {
              user.authenticate(connection, userName, password);
              result = true/false/Exception();
            }};
//call method now to test

}

也别忘了用同样的方式模拟上下文。

非常感谢,伙计。你能给我推荐一个网站,让我了解更多关于此类web应用程序集成测试的信息吗?@ValentinosIoannou你可能想看看。不知道现在有多体面。当我三年前评估它时,它仍然有点笨拙,但我认为它已经改进了。