日期:2014-05-20  浏览次数:20697 次

大家如何单元测试JSP~我都弄了四天了,还是没搞定~
如何单元测试JSP呀。

先说一下,我使用的IDE为m2eclipse~

我从JUnit in Action的书中了解到可以使用cactus来实现,于是我就Google了很久及看maven官网,来使用maven3及插件cactus.integration.maven2来实现集成单元测试自动化(其中用到了war插件来打包及cargo插件来自动部署及开启关闭服务器)。但cactus.integration.maven2插件没有JUnit in Action书中提到的cactus目标,所有还是要手动输入URL来测试。但这几乎还是我不想要的。

以上费了我两天中的业余时间,就为了单元测试JSP!命苦呀!


接着我又GOOGLE,说JUnit recipes有一章说了单元测试JSP。于是我就看了那一章的关于单元测试JSP的节~

写下了代码:
Java code

package jsps;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import java.util.*;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import junit.framework.*;

import com.dongantech.eshop.model.*;
import com.dongantech.eshop.services.requests.*;
import com.dongantech.eshop.services.responses.*;
import com.dongantech.eshop.web.servlets.*;
import com.dongantech.eshop.services.handlers.*;

import org.easymock.*;

import com.meterware.servletunit.*;
import com.meterware.httpunit.*;

public class TestMemberManagerServletResponseJsps extends DongAnShopJspFixture{
    private ServletRunner servletRunner = null ;
    private RequestHandler mockFindHandler = null;
    private MockControl requestHandlerMockControl = null ;
    
    public void setUp(){
        try {
            servletRunner = new ServletRunner(new File(DongAnShopJspFixture.getWebDeploymentDescriptorPath()),"/donganshop");
            
            requestHandlerMockControl = MockControl.createControl(RequestHandler.class);
            mockFindHandler = (RequestHandler) requestHandlerMockControl.getMock();
        } catch (Exception e) {
            e.printStackTrace();
            fail("fail to new ServletRunner!");
        }
    }
    public void testFoundResponseJsp() throws Exception{
        Member preparedMember = new Member("lj");
        Request preparedRequest = new SimpleRequest();
        Map requestContext = new HashMap();
        requestContext.put("memberFound",preparedMember);
        preparedRequest.setContext(requestContext);
        preparedRequest.setName(SimpleRequest.TYPE_FIND);
        
        mockFindHandler.process(preparedRequest);
        requestHandlerMockControl.setReturnValue(createMemberFoundResponse());
        requestHandlerMockControl.replay();
        ////////////////////////////////////////////////////////////////////////////////////////////////////////
        ServletUnitClient client = servletRunner.newClient();
        WebRequest request = new GetMethodWebRequest("http://localhost/donganshop/members/memberManager");
        request.setParameter("request",SimpleRequest.TYPE_FIND);
        request.setParameter("username","lj");
        
        InvocationContext invocationContext = client.newInvocation(request);
        MemberManagerServlet servlet = (MemberManagerServlet) invocationContext.getServlet();
        servlet.putIntoRequestHandlers("FIND",mockFindHandler);
        
        HttpServletRequest httpReq = invocationContext.getRequest();
        HttpServletResponse httpResp = invocationContext.getResponse();
        servlet.getPages().put(SimpleResponse.TYPE_FOUND,MemberManagerServlet.PAGE_FOUND);
        servlet.service(httpReq, httpResp);
        WebResponse response = invocationContext.getServletResponse();
        
        System.out.println(response.getText());
    }
    public void tearDown(){
        requestHandlerMockControl.verify();
    }
    public Response createMemberFoundResponse(){
        Response resp = new SimpleResponse();
        List<Member> foundMembers = new ArrayList();
        foundMembers.add(new Member("lj"));
        foundMembers.add(new Member("lj520"));

        resp.setType(SimpleResponse.TYPE_FOUND);
        resp.getContext().put("members", foundMembers);

        return resp;
    }
}


帖子过长,看下贴: