PHP8.1.21版本已发布
vue8.1.21版本已发布
jquery8.1.21版本已发布

新Java运动:测试驱动开发3---用户注册2

黄舟
黄舟 原创
2016-12-30 13:13:11 1007浏览

测试驱动开发(tdd)其实不是一个新概念,但是这种方法论的实质经常被误解。以我为例,我觉得测试驱动开发就是写单元测试,对代码进行充分测试。其实这是一种对测试驱动开发的一种最常见的误解,测试驱动开发不仅仅是强调测试,其同时更强调驱动开发。编写测试用例的的目的不仅仅是进行测试,而且是一种设计,是对功能及接口的设计,而且是以功能或接口使用者的角度来进行设计,而其他方法学中的设计,则是在开发人员角度上的设计,因此测试驱动开发更有利于产生好的设计。

但是仅仅通过测试进行设计,运行测试来保证代码质量,还不足以产生高质量的软件产品。测试驱动开发同时还强调重构,就是对代码不合理的地方进行重构,而且这个重构在每次编写测试、开发、验证进程中都需要进行,由于有测试用例进行保证,我们可以放心大胆的进行重构,而不用担心会导致意想不到的后果出现。

回到我们的项目中,在mainservlet中,我们实现了全部的业务逻辑,但是我们很快就会意识到,如果所有应用逻辑都写到这个类中,那个这个类将变成一个巨无霸,最终会变得不可维护,因此我们需要将用户注册业务逻辑实现放到用户模块中去。大家可以看到,我们已经开始重构我们的系统了。

首先,我们建立user包,在该包下面建立usermngr类,因为我们预估,用户模块除了维护用户基本信息外,还需要维护用户群组、用户级别、用户积分等信息,如果让调用者完全了解这些细节信息是没有必要的,因此我们在这里用了facade模式,所有对用户的操作均通过usermngr来进行。代码如下所示:

public class UserMngr {  
    public static long registerUser(Map<String, Object> userInfo) {  
        return 101;  
    }  
}

我们看到,在这个类里,我们仅返回一个值,什么也没做,为的是快速验证我们的重构架构是可以工作的,具体功能可以在以后添加。另外,需要注意的是参数项,这里用的是Map对象,即以类似PHP中的数组来传递参数。在Java中更常见的作为是为此目的设计一个值对象类,但是这经常造成定义许多值对象类,或者由于共用的需要,一个值对象非常庞大,这里采用Map来传递参数省去了这样的麻烦。

下面在MainServlet中加入对用户模块调用的代码:

private void registerUser(HttpServletRequest request, HttpServletResponse response) 
			throws IOException, ServletException {
		String userName = null;
		if (request.getParameter("userName") != null) {
			userName = request.getParameter("userName");
		}
		Map<String, Object> userInfo = new HashMap<String, Object>();
		userInfo.put("userName", userName);
		long userId = UserMngr.registerUser(userInfo);
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("userId", "" + userId);
		request.setAttribute("model", model);
		/*this.getServletContext().getRequestDispatcher("/caporder/apply_capital.jsp")
			.forward(request, response);*/
	}

下面运行测试用例,应该可以通过,这证明我这次对架构的重构是成功的。

 以上就是新Java运动:测试驱动开发3---用户注册2的内容,更多相关内容请关注PHP中文网(www.php.cn)!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。