文档章节

单元测试代码:SpringTest+JUnit

jtn
 jtn
发布于 2015/04/13 15:07
字数 464
阅读 22
收藏 0
/**
 * JUnit单元测试父类,配置了Spring的基础环境。 <br/>
 * 可以作为Controller、Service、Dao单元测试的父类。
 * 
 * @author leiwen@fansunion.cn
 */
public class JUnitTestBase {

 public static XmlWebApplicationContext context = null;

 private static HandlerMapping handlerMapping;
 private static HandlerAdapter handlerAdapter;

 // /public static String[] CONFIG_FILES = { "classpath:spring-*.xml" };

 // public static String[] configs = { "file:src/main/resources/spring-*.xml"
 // };
 public static String[] CONFIG_FILES = { "file:src/main/resources/spring-*.xml" };

 /**
  * 读取spring配置文件,初始化上下文。
  */
 @BeforeClass
 public static void setUp() {
  System.out.println("Test start...");

  context = new XmlWebApplicationContext();
  context.setConfigLocations(CONFIG_FILES);

  MockServletContext msc = new MockServletContext();
  context.setServletContext(msc);
  context.refresh();
  msc.setAttribute(
    WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
    context);

  handlerMapping = (HandlerMapping) context
    .getBean(DefaultAnnotationHandlerMapping.class);
  handlerAdapter = (HandlerAdapter) context.getBean(context
    .getBeanNamesForType(AnnotationMethodHandlerAdapter.class)[0]);

 }

 // 执行request对象请求的action
 public ModelAndView excuteAction(HttpServletRequest request,
   HttpServletResponse response) throws Exception {
  // 这里需要声明request的实际类型,否则会报错
  request.setAttribute(HandlerMapping.INTROSPECT_TYPE_LEVEL_MAPPING, true);

  HandlerExecutionChain chain = handlerMapping.getHandler(request);
  Object handler = chain.getHandler();
  final ModelAndView model = handlerAdapter.handle(request, response,
    handler);
  return model;
 }

 @AfterClass
 public static void tearUp() {
  System.out.println("Test end!");
 }

}

 




//测试Controller的2种方法

 

/**
 * CampaignGroupController单元测试。
 * 
 * @author leiwen@fansunion.cn
 */
public class FansUnionControllerTestextends JUnitTestBase {

 @Test
 public void prevAddCampaignGroup() throws Exception {
  MockHttpServletRequest request = new MockHttpServletRequest();
  MockHttpServletResponse response = new MockHttpServletResponse();
  String requestURI = "/campaignGroup/prevAdd";
  request.setRequestURI(requestURI);
  request.setMethod("POST");
  final ModelAndView mav = this.excuteAction(request, response);
  Assert.assertEquals("createCampaignGroup", mav.getViewName());

 }

 @Test
 public void prevAddCampaignGroup2() throws Exception {
  CampaignGroupController userController = context.getBean(CampaignGroupController.class);
  MockMvc mockMvc = MockMvcBuilders.standaloneSetup(userController)
    .build();
  ResultActions perform = mockMvc.perform(MockMvcRequestBuilders.post("/campaignGroup/prevAdd"));
  ResultActions andExpect = perform
    .andExpect(MockMvcResultMatchers.status().is(200));
  andExpect
    .andExpect(
      MockMvcResultMatchers.view()
        .name("createCampaignGroup"));
 }

}

 

----需要配置2个bean,测试Controller需要用到

<bean
  class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
 </bean>
 <bean
  class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
 </bean>

 

测试Service(Dao类似)

/**
 * 这种方式 的单元测试,不需要重复指定 资源文件,减少重复。 麻烦的地方在于,需要手动获取bean。
 * 
 * @author leiwen@fansunion.cn
 */
public class FansUnionServiceTest extends JUnitTestBase {

 private static CampaignGroupService campaignGroupService = context
   .getBean(CampaignGroupService.class);

 

 // 测试add,remove,update方法的时候,已经测试了find?
 @Test
 public void addCampaignGroup() {
  CampaignGroup cg = buildOneGroup();

  campaignGroupService.add(cg);

  CampaignGroup dbCampaignGroup = campaignGroupService.find(cg.getId());
  Assert.assertEquals(cg, dbCampaignGroup);
  campaignGroupService.delete(cg.getId());
 }

 

基于注解的测试

/**
 * 
 * 基于注解的单元测试。
 * 
 * @author leiwen@fansunion.cn
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:spring-mvc-context.xml",
  "classpath:spring-common-context.xml" })
public class FansUnionServiceTestWithAnnotation {
 
 @Autowired
 private CampaignGroupService campaignGroupService;
 
 /**
  * 根据campaignId获取campaignGroup的name集合<br>
  * 测试场景:<br>
  * 
  */
 @Test
 public void testListCampaignGroupNameByCampaignId(){
  System.out.println("**********");
  System.out.println(campaignGroupService.listCampaignGroupNameByCampaignId(1005899));
 }

}

 

参考资料:http://lohasle.iteye.com/blog/1617929

http://jiuyuehe.iteye.com/blog/1882424

 

 

 

© 著作权归作者所有

jtn

jtn

粉丝 12
博文 879
码字总数 879609
作品 0
武汉
程序员
私信 提问
C/C++单元测试问答(摘要)

为什么要进行单元测试? 单元测试保证局部代码的质量 单元测试改良项目代码的整体结构 单元测试降低测试、维护升级的成本 单元测试使开发过程适应频繁变化的需求 单元测试有助于提升程序员的能...

EasyTDD
2014/04/24
71
0
单元测试和测试驱动开发 TDD 是怎么回事?

对于测试驱动开发和单元测试,我总有一种既爱又恨的感情在里面。 我一直都是这些“最佳实践”的热心支持者,但是我对它们的使用也一直持有怀疑态度。 软件开发中最大的问题之一是开发者或管理...

班纳睿
2018/10/10
876
0
C/C++单元测试问答(摘要)

为什么要进行单元测试? 单元测试保证局部代码的质量 单元测试改良项目代码的整体结构 单元测试降低测试、维护升级的成本 单元测试使开发过程适应频繁变化的需求 单元测试有助于提升程序员的能...

dellfox
2014/04/24
0
0
表格驱动的单元测试技术(1)

【摘要】本文分析了传统单元测试技术的不足,提出了表格驱动的单元测试技术,新技术可以大幅降低单元测试的难度及综合成本,用户不需要编写测试代码,测试工作效率通常是现有技术的五倍以上。...

dellfox
2014/03/27
0
0
C#_在VS2010下进行单元测试

在VS2010中,单元测试的功能很强大,使得建立单元测试和编写单元测试代码,以及管理和运行单元测试都变得简单起来,通过私有访问器可以对私有方法也能进行单元测试,并且支持数据驱动的单元测...

xiao刀
2013/04/23
568
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot 集成MongoDB

一、MongoDB 简介 MongoDB 如今是最流行的 NoSQL 数据库,被广泛应用于各行各业中,很多创业公司数据库选型就直接使用了 MongoDB,但对于大部分公司,使用 MongoDB 的场景是做大规模数据查询...

zw965
16分钟前
10
0
使用 Envoy 和 AdGuard Home 阻挡烦人的广告

> 原文链接:使用 Envoy 和 AdGuard Home 阻挡烦人的广告 通常我们使用网络时,宽带运营商会为我们分配一个 DNS 服务器。这个 DNS 通常是最快的,距离最近的服务器,但会有很多问题,比如: ...

米开朗基杨
50分钟前
16
0
springboot之全局处理异常封装

springboot之全局处理异常封装 简介 在项目中经常出现系统异常的情况,比如NullPointerException等等。如果默认未处理的情况下,springboot会响应默认的错误提示,这样对用户体验不是友好,系...

Purgeyao
今天
22
0
cookie

cookie: n. 饼干;小甜点 为什么会引入Cookie(在客户端保持http状态) 因为http协议是一种无状态协议,web服务器本身不能识别出哪些请求是同一个服务器发送的,浏览器的每一次请求都是独立...

五公里
今天
23
0
PHP常用函数

<?php/** * 获取客户端IP * @return [string] [description] */function getClientIp() { $ip = NULL; if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode('......

半缘修道半缘君丶
今天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部