unitils 测试框架介绍(二)
来源:互联网 发布:下载淘宝外卖app 编辑:程序博客网 时间:2024/04/24 10:33
这节主要介绍Service层和Web层介绍.
Service层测试:
方案1 :利用Mock 对象
@SpringApplicationContext( {"baobaotao-dao.xml","baobaotao-service.xml" })public class UserServiceTest extends UnitilsJUnit4 {@SpringBean("userService")private UserService userService;// mock 模拟对象private UserDao userDao;private LoginLogDao loginLogDao;@Beforepublic void init(){userDao = mock(UserDao.class);loginLogDao = mock(LoginLogDao.class);}@Testpublic void hasMatchUser() { User user = new User(); user.setUserName("tom"); user.setPassword("1234"); user.setCredits(100L); doReturn(1).when(userDao).getMatchCount("tom", "1234"); UserServiceImpl userService = new UserServiceImpl(); ReflectionTestUtils.setField(userService, "userDao", userDao); boolean isMatch = userService.hasMatchUser("tom", "1234"); assertThat(isMatch,is(true)); verify(userDao,times(1)).getMatchCount("tom", "1234");}@Test // 只想测试service 层的功能 利用mock 不用连接数据库就可以进行sevice层测试public void findUserByUserName() { User user = new User(); user.setUserName("tom"); user.setPassword("1234"); user.setCredits(100L); doReturn(user).when(userDao).findUserByUserName("tom"); UserServiceImpl userService = new UserServiceImpl(); // 设置UserService 属性 一个访问测试对象中私有属性非常好的工具类 ReflectionTestUtils.setField(userService, "userDao", userDao); User u = userService.findUserByUserName("tom"); assertNotNull(u); assertThat(u.getUserName(),equalTo(user.getUserName())); // 验证findUserByUserName被调用的次数 verify(userDao,times(1)).findUserByUserName("tom");}利用Mock 对象,模拟DAO层的访问,通过设置其返回对象模拟数据库访问操作。这时候是不需要连接数据库和加载数据上下文的,只是通过mock对象测试Service业务逻辑的正确性。
方案2:加载Spring 上下文,利用Excel准备测试数据。
<span style="white-space:pre"></span>@Test@DataSet("BaobaoTao.SaveUsers.xls")// 通过读取xls 准备测试数据public void loginSuccess() {User user = userService.findUserByUserName("tom");Date now = new Date();user.setLastVisit(now);userService.loginSuccess(user); User u = userService.findUserByUserName("tom"); assertThat(u.getCredits(),is(105L));}
@DataSet注解将解析Excel数据插入到数据库,通过@SpringBean("userService") private UserService userService;从应用上下文中加载,然后调用severic方法,测试业务逻辑的正确性,这时候DAO层进行了实际的数据库访问。这是时候需要加载Spring 应用上下文和配置文件,其配置文件省略介绍。
Web层测试:
Spring在org.springframework.mock包中为一些依赖于容器的接口提供了模拟类,这样可以在不启动容器的情况下执行单元测试,提高测试运行效率,模拟类包含以下包:
1、org.springframework.mock.jndi JNDI SPI接口提供的模拟类
2、org.springframework.mock.web servelt API 接口(HttpServletRequest、ServletContext),可以脱离servlet容器进行测试。
3、org.springframework.mock.web.portlet
首先测试前提,一个Spring MVC 下的登录操作,Web层代码如下:
@Controllerpublic class LoginController{@Autowiredprivate UserService userService; //②负责处理/index.html的请求@RequestMapping(value = "/index.html")public String loginPage(){return "login";} //③负责处理/loginCheck.html的请求@RequestMapping(value = "/loginCheck.html")public ModelAndView loginCheck(HttpServletRequest request){User user = new User();user.setUserName(request.getParameter("userName"));user.setPassword(request.getParameter("password"));boolean isValidUser = userService.hasMatchUser(user.getUserName(), user.getPassword());if (!isValidUser) {return new ModelAndView("login", "error", "用户名或密码错误。");} else { user = userService.findUserByUserName(user.getUserName());user.setLastIp(request.getLocalAddr());user.setLastVisit(new Date());userService.loginSuccess(user);request.getSession().setAttribute("user", user);return new ModelAndView("main");//ModelAndView mv = new ModelAndView("xStreamMarshallingView");//mv.addObject(user);//return mv;}}}
其中涉及到jsp文件和配置文件省略介绍。
1、使用Spring Servlet API 模拟对象
@SpringApplicationContext( { "classpath:applicationContext.xml","file:webapp/WEB-INF/baobaotao-servlet.xml" })public class LoginControllerTest extends UnitilsJUnit4 {// ① 从Spring容器中加载AnnotationMethodHandlerAdapter@SpringBeanByTypeprivate AnnotationMethodHandlerAdapter handlerAdapter;// ② 从Spring容器中加载LoginController@SpringBeanByTypeprivate LoginController controller;@SpringBeanByTypeprivate RestTemplate restTemplate;// ③ 声明Request与Response模拟对象private MockHttpServletRequest request;private MockHttpServletResponse response;// ④ 执行测试前先初始模拟对象@Beforepublic void before() {request = new MockHttpServletRequest();request.setCharacterEncoding("UTF-8");response = new MockHttpServletResponse();}// ⑤ 测试LoginController#loginCheck()方法@Testpublic void loginCheckByMock() throws Exception {request.setRequestURI("/loginCheck.html");request.addParameter("userName", "tom"); // ⑥ 设置请求URL及参数request.addParameter("password", "1234");// ⑦ 向控制发起请求 ” /loginCheck.html”ModelAndView mav = handlerAdapter.handle(request, response, controller);User user = (User) request.getSession().getAttribute("user");assertNotNull(mav);assertEquals(mav.getViewName(), "main");assertNotNull(user);assertThat(user.getUserName(), equalTo("tom"));// ⑧ 验证返回结果assertThat(user.getCredits(), greaterThan(5L));}}加载Spring 和servlet上下文,在配置文件中需要配置
<bean id="defaultAnnotationHandlerMapping"class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /><bean id="annotationMethodHandlerAdapter"class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
通过注入handlerAdapter获取实例,利用MockHttpServletRequest和MockHttpServletResponse模拟类模拟request 和response操作。
这时不需要启动Servlet容器。
2、Spring RestTemplate 测试:
RestTemplate是利用在客户端访问WEB服务的类。
利用RestTemplate得现在Spring配置文件中配置:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> <!--配置消息转换器--><property name="messageConverters"><list><bean id="stringHttpMessageConverter"class="org.springframework.http.converter.StringHttpMessageConverter" /><bean id="formHttpMessageConverter"class="org.springframework.http.converter.FormHttpMessageConverter" /></list></property></bean>配置了两个消息转化器。
其测试代码如下:
@Testpublic void loginCheck() { //MultiValueMap是Map的一种实现形式,它最大的特定是可以为一个key对应多个valueMultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();map.add("userName", "john");map.add("password", "1234");String result = restTemplate.postForObject("http://localhost/chapter16/loginCheck.html", map, String.class);assertNotNull(result);assertThat(result, containsString("用户名或密码错误"));map.clear();map.add("userName", "tom");map.add("password", "1234"); result = restTemplate.postForObject("http://localhost/chapter16/loginCheck.html", map, String.class);System.out.println(result); assertNotNull(result);assertThat(result, containsString("tom,欢迎您进入宝宝淘论坛"));}
这是需要启动Web容器进行测试。
3、使用Selenium 测试
Selenium 是模拟用户对视图在不同浏览器中的操作正确性的测试,这也是WEB测试的重点和难点,支持Firefox,IE,Opear,Chrome等主要浏览器,通过加载不同浏览器的web测试驱动器来测试视图在不同浏览器下的正确性。这里不做介绍了。
- unitils 测试框架介绍(二)
- unitils 测试框架介绍(一)
- UNITILS 测试框架
- Unitils介绍(二)-- Assertion utilities
- 单元测试之测试整合框架Unitils
- Unitils配置文件(Unitils介绍四)
- Lenient assertions(Unitils介绍三)
- Maven整合Junit unitils测试框架 cannot retrieve JUnit method
- 16.2 测试之unitils
- Unitils介绍(一)
- 测试整合之王Unitils(单元测试系列)
- python nose测试框架全面介绍二
- unitils学习2一使用Unitils测试DAO层
- unitils学习3一使用unitils测试Service层
- Acegi框架介绍(二)
- xUtils框架介绍(二)
- xUtils框架介绍(二)
- xUtils框架介绍(二)
- 删除第一个文字
- UVA 10131 Is Bigger Smarter ? DP ,Commencel
- UVa 167 - The Sultan's Successors
- 黑马程序员_Java基础_线程间通信,生产者消费者案例,jdk1.5锁机制,守护线程
- python3重载模块
- unitils 测试框架介绍(二)
- hdu 2222 Keywords Search
- python核心编程 第五章练习题答案(简单的没上)
- 将中文转换成拼音的组件类的pinyin
- LeetCode Longest Substring Without Repeating Characters
- Apache虚拟主机配置
- 内核定时器
- FireMonkey Windows热键框制作
- Informix 错误整理 Could not set resource limit: errno 1