我已经使用Java Servlet创建了一个web系统,现在想要进行JUnit测试。我的dataManager
只是将其提交到数据库的一段基本代码。如何使用JUnit测试Servlet?
我的代码示例允许用户注册/注册,它是通过AJAX从我的主页提交的:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
// Get parameters
String userName = request.getParameter("username");
String password = request.getParameter("password");
String name = request.getParameter("name");
try {
// Load the database driver
Class.forName("com.mysql.jdbc.Driver");
//pass reg details to datamanager
dataManager = new DataManager();
//store result as string
String result = dataManager.register(userName, password, name);
//set response to html + no cache
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");
//send response with register result
response.getWriter().write(result);
} catch(Exception e){
System.out.println("Exception is :" + e);
}
}
发布于 2011-05-18 05:27:53
您可以使用Mockito来执行此操作,让模拟返回正确的参数,验证它们是否确实被调用(可选地指定次数),写入“结果”并验证其是否正确。
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.io.*;
import javax.servlet.http.*;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
public class TestMyServlet extends Mockito{
@Test
public void testServlet() throws Exception {
HttpServletRequest request = mock(HttpServletRequest.class);
HttpServletResponse response = mock(HttpServletResponse.class);
when(request.getParameter("username")).thenReturn("me");
when(request.getParameter("password")).thenReturn("secret");
StringWriter stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter);
when(response.getWriter()).thenReturn(writer);
new MyServlet().doPost(request, response);
verify(request, atLeast(1)).getParameter("username"); // only if you want to verify username was called...
writer.flush(); // it may not have been flushed yet...
assertTrue(stringWriter.toString().contains("My expected string"));
}
}
发布于 2011-03-29 05:54:00
首先,在实际的应用程序中,您永远不会在servlet中获得数据库连接信息;您需要在应用程序服务器中配置它。
但是,有一些方法可以在不运行容器的情况下测试Servlets。一种是使用模拟对象。Spring为HttpServletRequest、HttpServletResponse、HttpServletSession等提供了一组非常有用的mock:
使用这些mock,您可以测试以下内容
如果请求中没有用户名,会发生什么?
如果请求中包含用户名,会发生什么情况?
等
然后,您可以执行以下操作:
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
public class MyServletTest {
private MyServlet servlet;
private MockHttpServletRequest request;
private MockHttpServletResponse response;
@Before
public void setUp() {
servlet = new MyServlet();
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
}
@Test
public void correctUsernameInRequest() throws ServletException, IOException {
request.addParameter("username", "scott");
request.addParameter("password", "tiger");
servlet.doPost(request, response);
assertEquals("text/html", response.getContentType());
// ... etc
}
}
发布于 2014-10-29 02:44:01
另一种方法是创建一个嵌入式服务器来“托管”servlet,允许您使用旨在调用实际服务器的库来编写对它的调用(这种方法的有用性在一定程度上取决于您对服务器进行“合法”编程调用的难易程度-我测试的是JMS (Java消息传递服务)访问点,对于该访问点,客户机比比皆是)。
你可以选择几条不同的路线--通常的两条是tomcat和jetty。
警告:在选择要嵌入的服务器时,需要注意的是您正在使用的servlet-api版本(提供HttpServletRequest等类的库)。如果您使用的是2.5,我发现Jetty 6.x运行良好(这是我将在下面给出的示例)。如果您使用的是servlet-api 3.0,那么tomcat-7 embedded似乎是一个不错的选择,但是我不得不放弃使用它的尝试,因为我测试的应用程序使用的是servlet-api 2.5。在尝试配置或启动服务器时,尝试混合使用这两种方法将导致NoSuchMethod和其他类似的异常。
您可以这样设置这样的服务器(Jetty 6.1.26,servlet-api 2.5):
public void startServer(int port, Servlet yourServletInstance){
Server server = new Server(port);
Context root = new Context(server, "/", Context.SESSIONS);
root.addServlet(new ServletHolder(yourServletInstance), "/servlet/context/path");
//If you need the servlet context for anything, such as spring wiring, you coudl get it like this
//ServletContext servletContext = root.getServletContext();
server.start();
}
https://stackoverflow.com/questions/5434419
复制相似问题