如何测试使用数据库登录的Servlet?
How to Test Servlet that uses database to login?
大家好,我想使用 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);
}
}
}
方法 user.authenticate returns 如果在数据库中找到用户则为真。
log.log(记录用户的 IP 地址和成功或失败)
谁能帮我测试一下。
无法对涉及数据库的代码进行单元测试 interactions.Those 包含在集成 tests.However 中,如果您想在 JUnit 测试下测试它,那么您可以模拟连接和 return 使用 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
}
也不要忘记以同样的方式模拟 Context。
大家好,我想使用 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);
}
}
}
方法 user.authenticate returns 如果在数据库中找到用户则为真。 log.log(记录用户的 IP 地址和成功或失败) 谁能帮我测试一下。
无法对涉及数据库的代码进行单元测试 interactions.Those 包含在集成 tests.However 中,如果您想在 JUnit 测试下测试它,那么您可以模拟连接和 return 使用 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
}
也不要忘记以同样的方式模拟 Context。