我正在使用Jetty提供的ServletTester类来测试我的一个servlet。
servlet使用InputStream.read()读取请求的主体,以构造一个byte [],它由servlet解码并执行。
ServletTest类提供了方法getResponses(ByteArrayBuffer),但我不确定如何以正确的格式创建其中一个,因为它还需要包含诸如头之类的东西(例如“Content-Type:application / octet-stream” )。
任何人都可以向我展示一种简单的方法来构建它,最好使用现有的库,以便我可以以类似于HttpTester类的方式使用它。
如果有一种“更好”的方法来测试servlet(理想情况下使用本地连接器而不是通过tcp堆栈),我也想听听。
非常感谢,
答案 0 :(得分:5)
为什么要使用模拟?为什么不通过在jetty中运行它来测试servlet?
Servlet servlet = new MyServlet();
String mapping = "/foo";
Server server = new Server(0);
Context servletContext = new Context(server, contextPath, Context.SESSIONS);
servletContext.addServlet(new ServletHolder(servlet), mapping);
server.start();
URL url = new URL("http", "localhost", server.getConnectors()[0].getLocalPort(), "/foo?bar");
//get the url...assert what you want
//finally server.stop();
编辑:只是想让人们放心,这是非常快的。它也是一个非常可靠的指标,表明你的代码实际上会做什么,因为它实际上是在做它。
答案 1 :(得分:3)
Spring MVC为各种javax.servlet
接口提供a small set of "mock" classes,例如HttpServletRequest
,HttpSession
等。这样可以很容易地对servlet之类的单元进行单元测试,只需将模拟注入到例如servlet中。 doGet()
方法。
即使您不在服务器上使用Spring本身,您仍然可以使用库中的模拟,仅用于测试。
答案 2 :(得分:1)
您可以使用HttpClient来简化测试。看看以下文章:
http://roberthanson.blogspot.com/2007/12/testing-servlets-with-junit.html
与servlet测试器结合使用时,应该为您提供您想要的单元测试。