新Java运动:测试驱动开发2

设计驱动开发要测试先行,因此需要有一个运行环境来运行测试和开发代码。因此,我们第一步是开发一个最小的,包括所有参与者的系统。然后在这个最小框架系统下,我们才可以每次测试、开发、重构一小步。我们所要开发的是一个Web系统,因此需要开发一个Web应用,同时我们需要与股票交易所交互,因此需要一个股票交易所模拟器,暂时规定股票交易所模拟器采用Json Over HTTP协议。为了接收股票交易所的通知,我们的Web应用需要有一个供股票交易所回调的URL。

明确了上述需求之后,我们就可以开发最小框架系统了。

第一步当然是开发Web应用,我们就采用新Java运动Nava:师PHP技术以开发Web应用中所定义的架构。

股票交易所模拟器的建立方法与上面的方法类似。

首先,我想要完成用户注册功能。具体功能为用户通过页面输入用户、密码等,并点击确认按钮,系统会自动为用户在系统中建立账户。为了完成这一功能,我还需要准备一下我们的工作环境:一个是建立用户及账户数据库表,其次是配置Jboss使用Mysql数据库。数据库表结构如下所示:

终于所有的环境准备可以告一段落了,可以具体开始真正的测试驱动开发过程了。

由于我们是网页应用,直接采用网页进行测试会比较费时费力,而且只能人工进行,不能实现自动化和回归测试,因此我们在下面主要采用Junit进行测试驱动开发。

下面我们需要模拟用户请求,为了模拟用户请求,我们需要构造HttpServletRequest及HttpServletResponse,以这些为参数才能调用MainServlet中的方法。因此,我们首先定义两个模拟类HttpJunitRequest和HttpJunitResponse类,这两个类分别实现HttpServletRequest和HttpServletResponse接口。同时,我们需要重点实现HttpJunitRequest中的两个与参数获取有关的方法。

public class HttpJunitRequest implements HttpServletRequest {private final Map<String, String[]> params = new HashMap<String, String[]>();public Map<String, String[]> getParameterMap() {return params;}public String getParameter(String name) {String[] matches = params.get(name);if (matches == null || matches.length == 0)return null;return matches[0];}.... 省略其他方法定义

有了上述准备,我们就可以生成Junit测试类了,生成MainServlet单元测试类MainServletTest,定义新测试方法:

@Testpublic void test() {HttpServletRequest request = new HttpJunitRequest();Map<String, String[]>params = (Map<String, String[]>)request.getParameterMap();String[] cmd = new String [1];cmd[0] = "junit";params.put("cmd", cmd);MainServlet m = new MainServlet();HttpServletResponse response = new HttpJunitResponse();try {m.doGet(request, response);} catch (IOException | ServletException e) {// TODO Auto-generated catch blocke.printStackTrace();}assertTrue(1>0);}

运行上述代码,系统不会有任何反应。下面添加代码,以响应这个假的请求,在MainServlet中添加如下代码:

public void doProcess(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {request. setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.addHeader("Content-Type", "text/html; charset=utf-8");PrintWriter out = response.getWriter();// 求出请求命令String cmd = "none";if (request.getParameter("cmd") != null) {cmd = request.getParameter("cmd");}// 根据请求命令调用不同方法switch (cmd) {case "junit":System.out.println("in MainServlet.doProcess .....");break;.........

因为我们需要在MainServlet中输出一些内容,因此我们希望看到这些内容是否可以正常的显示出来。所以,我们需要实现HttpJunitResponse类的一些方法,由于我们一般用PrintWriter进行输出,因些我们重写getWriter这个方法:

private String respFilename = "d:/ablog/app.html";private PrintWriter out = null;@Overridepublic PrintWriter getWriter() throws IOException {// TODO Auto-generated method stubif (null == out) {out = new PrintWriter(respFilename); }return out;}

这样就可以在d:/ablog/app.html文件中看到MainServlet中通过out.print输出的内容了。另外,需要在Junit的方法中,最后调用一下response.getWriter().close()方法,这样在运行测试用例后,打开d:/ablog/app.html文件就可以看到我们输出的内容了。

好了,一切都已经就绪,重新运行单元测试,通过控制台,应该可以看到MainServlet的方法被调用。

至此,我们已经建立起一个可以运行的开发环境,下面我们就可以一步一步进行测试、开发、重构的构建流程了。

教育人的诗句或名言警句,激励人在逆境中脱颖而出的话

新Java运动:测试驱动开发2

相关文章:

你感兴趣的文章:

标签云: