首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用JUnit测试servlet

如何使用JUnit测试servlet
EN

Stack Overflow用户
提问于 2011-03-25 23:17:06
回答 6查看 187.1K关注 0票数 118

我已经使用Java Servlet创建了一个web系统,现在想要进行JUnit测试。我的dataManager只是将其提交到数据库的一段基本代码。如何使用JUnit测试Servlet?

我的代码示例允许用户注册/注册,它是通过AJAX从我的主页提交的:

代码语言:javascript
运行
复制
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);
    }  
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-05-18 05:27:53

您可以使用Mockito来执行此操作,让模拟返回正确的参数,验证它们是否确实被调用(可选地指定次数),写入“结果”并验证其是否正确。

代码语言:javascript
运行
复制
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"));
    }
}
票数 174
EN

Stack Overflow用户

发布于 2011-03-29 05:54:00

首先,在实际的应用程序中,您永远不会在servlet中获得数据库连接信息;您需要在应用程序服务器中配置它。

但是,有一些方法可以在不运行容器的情况下测试Servlets。一种是使用模拟对象。Spring为HttpServletRequest、HttpServletResponse、HttpServletSession等提供了一组非常有用的mock:

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html

使用这些mock,您可以测试以下内容

如果请求中没有用户名,会发生什么?

如果请求中包含用户名,会发生什么情况?

然后,您可以执行以下操作:

代码语言:javascript
运行
复制
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
    }
}
票数 52
EN

Stack Overflow用户

发布于 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):

代码语言:javascript
运行
复制
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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5434419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档