您的位置:首页 > 编程语言 > Java开发

新Java运动:测试驱动开发2---最小初始可运行系统

2013-03-07 14:15 351 查看
设计驱动开发要测试先行,因此需要有一个运行环境来运行测试和开发代码。因此,我们第一步是开发一个最小的,包括所有参与者的系统。然后在这个最小框架系统下,我们才可以每次测试、开发、重构一小步。我们所要开发的是一个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,定义新测试方法:

@Test
	public 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 block
			e.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;
	@Override
	public PrintWriter getWriter() throws IOException {
		// TODO Auto-generated method stub
		if (null == out) {
			out = new PrintWriter(respFilename); 
		}
		return out;
	}


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

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

至此,我们已经建立起一个可以运行的开发环境,下面我们就可以一步一步进行测试、开发、重构的构建流程了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: