我要单元测试Servlet逻辑的正确性
因此我预先构造了一个url
"http://localhost/donganshop/product/searcher?request=search&pagenumber=1&pagesize=5&name="+
URLEncoder.encode("电","utf8")+"%202000&number=001%20002&tlevel=0%202" ;
但中文字符“电”,在调试当中老是乱码,我的想法是客户端的信息编码及服务端的信息编码,都使用utf8.
由于这个乱码的原故,下面的这个测试总是过不了,所以也不能完成maven install,我使用断点来调式了我的所有与这个测试相关代码,判断出通不过的原因就是乱码引起的。而且url当中不使用中文字符是可以通过测试的。
关于这个单元测试,如何解决乱码问题呀。public class TestProductSearcherServlet extends DongAnShopFixture{
private String preparedHttpReqUrl = "" ;
private ServletRunner runner = null ;
private ServletUnitClient unitClient = null ;
private ProductSearcherServlet servlet = null ;
private RequestHandler handler = null ;
private MockControl handlerMockControl = null ;
private List<Product> expectedProducts = null ;
private Request preparedRequest = null ;
private Response preparedResponse = null ;
public void setUp()throws Exception{
preparedHttpReqUrl =
"http://localhost/donganshop/product/searcher?request=search&pagenumber=1&pagesize=5&name="+
URLEncoder.encode("电","utf8")+"%202000&number=001%20002&tlevel=0%202" ;
runner = new ServletRunner(DongAnShopFixture.getWebContentPath("WEB-INF/web-test.xml"),"/donganshop");
runner.registerServlet("/product/searcher", ProductSearcherServlet.class.getName());
unitClient = runner.newClient();
handlerMockControl = MockControl.createControl(RequestHandler.class);
handler = (RequestHandler) handlerMockControl.getMock();
}
public void testSearcherWithFoundResult() throws Exception{
InvocationContext iCtx = unitClient.newInvocation(preparedHttpReqUrl);
servlet = (ProductSearcherServlet) iCtx.getServlet();
HttpServletRequest httpRequest = iCtx.getRequest();
httpRequest.setCharacterEncoding("utf8");//设置编码为utf8
HttpServletResponse httpResponse = iCtx.getResponse();
expectedProducts = new ArrayList<Product>();
expectedProducts.add(new Product("AMD平台电脑","002001","123456789"));
Map responseContext = new HashMap();
responseContext.put("products",expectedProducts);
preparedResponse = new SimpleResponse();
preparedResponse.setType(AbstractResponse.TYPE_INFO);
preparedResponse.setContext(responseContext);
preparedRequest = getFoundResultRequest();
handler.process(preparedRequest);
handlerMockControl.setReturnValue(preparedResponse);
handlerMockControl.replay();
servlet.putIntoRequestHandlers(AbstractRequest.NAME_SEARCH, handler);
servlet.init();
Response realResponse = servlet.processRequest(httpRequest, httpResponse);
assertEquals(AbstractResponse.TYPE_INFO,realResponse.getType());
List<Product> realProducts = (List<Product>) realResponse.getContext().get("products");
assertEquals(expectedProducts,realProducts);
}
private Request getFoundResultRequest(){
Request request = new SimpleRequest();
request.setName("search");
request.getContext().put("pageNumber",new Integer(1));
request.getContext().put("pageSize",new Integer(5));
Map<String,List> keywords = new HashMap<String,List>();
List<String> nameWords = new ArrayList<String>();
nameWords.add("电");
nameWords.add("2000");
List<String> numberWords = new ArrayList<String>();
numberWords.add("001");
numberWords.add("002");
List<Long> levelWords = new ArrayList<Long>();
levelWords.add(new Long(0));
levelWords.add(new Long(2));
keywords.put("name",nameWords);
keywords.put("number",numberWords);
keywords.put("typeLevel",levelWords);
request.getContext().put("keywords",keywords);
return request ;
}
public void tearDown(){
handlerMockControl.verify();
}
}
因此我预先构造了一个url
"http://localhost/donganshop/product/searcher?request=search&pagenumber=1&pagesize=5&name="+
URLEncoder.encode("电","utf8")+"%202000&number=001%20002&tlevel=0%202" ;
但中文字符“电”,在调试当中老是乱码,我的想法是客户端的信息编码及服务端的信息编码,都使用utf8.
由于这个乱码的原故,下面的这个测试总是过不了,所以也不能完成maven install,我使用断点来调式了我的所有与这个测试相关代码,判断出通不过的原因就是乱码引起的。而且url当中不使用中文字符是可以通过测试的。
关于这个单元测试,如何解决乱码问题呀。public class TestProductSearcherServlet extends DongAnShopFixture{
private String preparedHttpReqUrl = "" ;
private ServletRunner runner = null ;
private ServletUnitClient unitClient = null ;
private ProductSearcherServlet servlet = null ;
private RequestHandler handler = null ;
private MockControl handlerMockControl = null ;
private List<Product> expectedProducts = null ;
private Request preparedRequest = null ;
private Response preparedResponse = null ;
public void setUp()throws Exception{
preparedHttpReqUrl =
"http://localhost/donganshop/product/searcher?request=search&pagenumber=1&pagesize=5&name="+
URLEncoder.encode("电","utf8")+"%202000&number=001%20002&tlevel=0%202" ;
runner = new ServletRunner(DongAnShopFixture.getWebContentPath("WEB-INF/web-test.xml"),"/donganshop");
runner.registerServlet("/product/searcher", ProductSearcherServlet.class.getName());
unitClient = runner.newClient();
handlerMockControl = MockControl.createControl(RequestHandler.class);
handler = (RequestHandler) handlerMockControl.getMock();
}
public void testSearcherWithFoundResult() throws Exception{
InvocationContext iCtx = unitClient.newInvocation(preparedHttpReqUrl);
servlet = (ProductSearcherServlet) iCtx.getServlet();
HttpServletRequest httpRequest = iCtx.getRequest();
httpRequest.setCharacterEncoding("utf8");//设置编码为utf8
HttpServletResponse httpResponse = iCtx.getResponse();
expectedProducts = new ArrayList<Product>();
expectedProducts.add(new Product("AMD平台电脑","002001","123456789"));
Map responseContext = new HashMap();
responseContext.put("products",expectedProducts);
preparedResponse = new SimpleResponse();
preparedResponse.setType(AbstractResponse.TYPE_INFO);
preparedResponse.setContext(responseContext);
preparedRequest = getFoundResultRequest();
handler.process(preparedRequest);
handlerMockControl.setReturnValue(preparedResponse);
handlerMockControl.replay();
servlet.putIntoRequestHandlers(AbstractRequest.NAME_SEARCH, handler);
servlet.init();
Response realResponse = servlet.processRequest(httpRequest, httpResponse);
assertEquals(AbstractResponse.TYPE_INFO,realResponse.getType());
List<Product> realProducts = (List<Product>) realResponse.getContext().get("products");
assertEquals(expectedProducts,realProducts);
}
private Request getFoundResultRequest(){
Request request = new SimpleRequest();
request.setName("search");
request.getContext().put("pageNumber",new Integer(1));
request.getContext().put("pageSize",new Integer(5));
Map<String,List> keywords = new HashMap<String,List>();
List<String> nameWords = new ArrayList<String>();
nameWords.add("电");
nameWords.add("2000");
List<String> numberWords = new ArrayList<String>();
numberWords.add("001");
numberWords.add("002");
List<Long> levelWords = new ArrayList<Long>();
levelWords.add(new Long(0));
levelWords.add(new Long(2));
keywords.put("name",nameWords);
keywords.put("number",numberWords);
keywords.put("typeLevel",levelWords);
request.getContext().put("keywords",keywords);
return request ;
}
public void tearDown(){
handlerMockControl.verify();
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货