`
thinkerAndThinker
  • 浏览: 284743 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java单元测试Junit(五)使用Spring TestContext测试Spring应用

 
阅读更多

什么是Spring TestContext? 
      Spring TestContext是Spring提供的一套基于注解的Test框架,Spring TestContext有非常好的兼容性,可以无缝兼容JUnit,TestNG等单元测试框架,而且在其基础上增加更多的功能 


Spring TestContext为我们带来什么? 
      在Spring应用大行其道的今天,使用Spring来构建应用已经是再普通不过的事情,但当使用JUnit,TestNG等传统的单元测试技术和Spring进行结合的时候,就会出现很多并不如意的事情 
      1.Spring容器初始化问题:此问题已于JUnit4中被解决,通过使用@BeforeClass 
         可以有效防止Spring容器被多次初始化的问题 

      2.硬编码获取Bean:此问题是由于JUnit并不兼容Spring,所以当单元测试运行 
         的时候,无法解释Spring独有的注解,从而需要使用硬编码来获取Bean 

      3.数据现场破坏:JUnit当中可以使用DBUnit来进行数据现场维护的解决方案, 
         详情可以通过笔者的DBUnit使用了解DBUnit,Spring TestContext通过AOP 
         声明式事务来对单元测试进行回滚,有效的解决了数据现场的问题 

      4.事务:通常我们的单元测试都需要和数据库进行交互,但传统的JUnit的 
        组成单元为TestCase,并不存在事务的概念,而我们大多数情况下都需要 
        观察事务的执行过程或总体的性能,特别是对长事务模块的测试, 
        Spring TestContext允许单元测试支持事务的控制 


Spring TestContext使用: 
      首先为Maven增加Spring的依赖,由于Spring有众多依赖,这里就不给出代码了 


      以下为Spring TestContext的代码 


  1. package com.accentrix.ray;  
  2.  
  3. import org.junit.After;  
  4. import org.junit.Before;  
  5. import org.junit.Test;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.test.annotation.ExpectedException;  
  8. import org.springframework.test.annotation.Repeat;  
  9. import org.springframework.test.annotation.Rollback;  
  10. import org.springframework.test.annotation.Timed;  
  11. import org.springframework.test.context.ContextConfiguration;  
  12. import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;  
  13. import org.springframework.test.context.transaction.AfterTransaction;  
  14. import org.springframework.test.context.transaction.BeforeTransaction;  
  15.  
  16. import com.accentrix.vtc.hpp.entity.planning.User;  
  17. import com.accentrix.vtc.hpp.unit.dao.UserDao;  
  18.  
  19. //指定Spring配置文件位置  
  20. @ContextConfiguration(locations = "/applicationContext-test.xml")  
  21. /*  
  22.  *  配置事务是使用哪个事务管理器和默认是否回滚,通常继承  
  23.  *  AbstractTransactionalJUnit4SpringContextTests后不需配置  
  24.  *  @TransactionConfiguration(defaultRollback = true,transactionManager="test")  
  25.  */ 
  26. public class SpringTest extends AbstractTransactionalJUnit4SpringContextTests{  
  27.  
  28.     // 可以直接使用Spring Annotation的方式注入  
  29.     @Autowired 
  30.     private UserDao userDao;  
  31.  
  32.     private User user;  
  33.  
  34.     // 当有某些操作不想在包含在事务,希望在事务前执行时,使用@BeforeTransaction  
  35.     @BeforeTransaction 
  36.     public void beforeTransaction() {  
  37.         System.out.println("Hello ");  
  38.     }  
  39.  
  40.     /*  
  41.      * 由于继承了AbstractTransactionalJUnit4SpringContextTests,  
  42.      * 此时JUnit就拥有了事务控制,@Before和@After都会包含在事务当中  
  43.      */ 
  44.     @Before 
  45.     public void setUp() {  
  46.         System.out.println(userDao);  
  47.  
  48.         // 在开始前先插入测试数据  
  49.         user = new User(1"Ray""123");  
  50.         userDao.add(user);  
  51.         /*  
  52.          * 此时使用Spring Test的就需要注意,因为 Hibernate会将HQL或SQL语句进行缓存,所以  
  53.          * 这里若然DAO是使用Hibenrate,需要使用flush  
  54.          */ 
  55.         userDao.getSession().flush();  
  56.     }  
  57.  
  58.       
  59.     @Test 
  60.     @ExpectedException(RuntimeException.class// ①  
  61.     @Timed(millis = 1000// ②  
  62.     @Repeat(100// ③  
  63.     @Rollback(false// ④  
  64.     public void testMain() {  
  65.         throw new RuntimeException();  
  66.     }  
  67.  
  68.       
  69.     @After 
  70.     public void tearDown() {  
  71.         // 最后删除测试数据  
  72.         userDao.delete(user);  
  73.     }  
  74.  
  75.     // 当有某些操作不想在包含在事务,希望在事务后执行时,使用@AfterTransaction  
  76.     @AfterTransaction 
  77.     public void afterTrasaction() {  
  78.         System.out.println("World");  
  79.     }  
  80. }  
  81.  



      请留意上面代码中testMain上的4个注解 

@ExpectedException:此形式和@Test(expected=RuntimeException.class)一样,表示该单元测试应该抛出RuntimeException的错误,否者测试不通过,但建议使用JUnit提供的 

@Timed:Timed和@Test(timeout=1000)有所不同的,@Test(timeout=1000)代表被注解的方法单体执行超过1秒就会测试失败,但@Timed()为测试整个事务从开始到执行testMain再结束的总耗时,而且会把@Repeat的重复也计算在总耗时内 

@Repeat:Repeat代表此方法将会重复执行100次,注意,会重复执行@Before和@After方法 

@Rollback:这里是Spring TestContext我认为最大的魅力所在,只需一行简单的注解就可以实现控制回滚操作,此时可以覆盖基类中回滚默认为true的限制,可以控制是否回滚事务, true为回滚,false为不回滚 

@NotTransaction:请注意这个注解,在2.5版本此注解为声明该单元测试不需要事务支持,但在3.0版本后认为单元测试当中应该都要有事务控制,所以此注解已被Deprecated(不建议再使用) 

      除此以外Spring TestContext还提供了很多方便的操作让我们使用 


  1. public void testMain() {  
  2.         //获取ApplicationContext对象  
  3.         ApplicationContext ac = super.applicationContext;  
  4.           
  5.         //获取SimpleJdbcTemplate实现  
  6.         SimpleJdbcTemplate  simpleJdbcTemplate= super.simpleJdbcTemplate;  
  7.           
  8.         //获取某table的总行数  
  9.         super.countRowsInTable("t_user");  
  10.           
  11.         //执行某份外部的sql文件,true为当发生错误时仍然继续执行  
  12.         super.executeSqlScript("D:/execute.sql"true);  
  13.           
  14.         //快速删除某张表的全部记录  
  15.         super.deleteFromTables("t_test");  
  16.     }  
  17.  


Spring TestContext使用极其简单,通过简单的注解就能扩展JUnit单元测试,弥补了JUnit在测试Spring应用时的不足和空白,还可以使用Spring自身的注解对依赖进行注入,简化了此前每次获取Bean的烦恼,在Spring应用中请毫不犹疑的使用Spring Test,在Spring TestContext当中除了支持JUnit4以外,还支持JUnit3.8,TestNG等,只需将单元测试类分别继承AbstractTransactionalJUnit38SpringContextTests和AbstractTransactionalTestNGSpringContextTests即可。

分享到:
评论

相关推荐

    spring MVC junit 单元测试(controller)

    这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在的问题,提高软件的可靠性和可维护性。 首先,让我们了解Spring MVC的基本概念。Spring MVC...

    使用 Spring 2.5 TestContext 测试框架

    在本篇文章中,我们将深入探讨Spring 2.5 TestContext测试框架的核心特性和使用方法。 首先,Spring TestContext框架的核心是`@ContextConfiguration`注解,它用于指定测试类中应用上下文的配置。你可以通过此注解...

    Junit 单元测试完整案例

    在案例中,你将看到如何创建测试类,定义测试方法,设置测试数据,以及如何利用JUnit和Spring/Struts提供的工具来编写高效的单元测试。通过分析和运行源码,你可以了解如何将这些概念应用于实际项目,提高代码质量。...

    spring-test-junit5, JUnit ( a )的spring TestContext框架扩展( a ).zip

    spring-test-junit5, JUnit ( a )的spring TestContext框架扩展( a ) spring 5测试支持这个项目作为 5的正式 Prototype,在 spring TestContext框架测试支持,并与 SPR-13575结合到 Spring Framework 。 因此,在...

    通过spring管理的web工程的junit单元测试方法四

    Spring TestContext框架提供了一个统一的入口点,允许我们在JUnit测试中加载Spring应用上下文。这可以通过继承`@RunWith(SpringRunner.class)`注解的测试类实现,或者使用`@SpringBootTest`注解直接启动应用上下文...

    Spring 2.5 TestContext

    Spring 2.5 TestContext框架是Spring框架的一个重要组成部分,主要设计用于简化单元测试和集成测试的编写。这个框架提供了一种结构化的测试环境,它允许开发者在测试中利用Spring的依赖注入特性,以及对...

    spring3 junit 测试 + word

    在这个“spring3 junit 测试”主题中,我们将深入探讨如何在Spring3环境中集成和使用JUnit进行单元测试。Spring3提供了对JUnit的内置支持,允许我们在测试上下文中注入依赖,模拟服务,以及使用其强大的测试支持类。...

    Spring+JUnit4 +Ant测试报告

    总之,Spring+JUnit4+Ant的组合为Java开发提供了强大的单元测试能力。通过合理配置和使用这些工具,开发者可以更高效地进行测试,保证代码质量,降低维护成本。在压缩包文件"junitTest"中,可能包含了示例的测试代码...

    spring测试、struts测试、hibernate测试、软件测试、网站测试、利用JBuilder测试的单元测试技术

    你可以使用JUnit或TestNG作为基础测试框架,结合Spring TestContext Framework来创建和管理测试上下文,以便于隔离和测试单个组件或服务。 接下来,Struts测试主要关注基于Struts框架的应用程序。Struts是一个MVC...

    Spring+hibernate 单元测试

    #### 五、使用 TestContext 测试框架编写测试用例 使用 Spring 2.5 TestContext 测试框架编写测试用例的基本步骤如下: 1. **导入必要的依赖**:首先确保项目中包含 Spring 测试模块的相关依赖。 2. **定义测试类*...

    [课堂课件讲解]Java微服务实践-Spring Boot 测试.pptx

    在 Spring Boot 中,可以使用 JUnit 或 TestNG 等测试框架来进行单元测试。单元测试的目的是为了确保单个类或方法的正确性和可靠性。 Spring 测试 Spring 测试是指对基于 Spring 框架的应用程序的测试。Spring ...

    day38 20-Spring与Junit整合

    标题中的“Spring与JUnit整合”指的是在Java开发中将Spring框架和JUnit测试框架结合使用,以便进行高效且全面的单元测试。Spring是一个广泛使用的开源框架,它提供了依赖注入(DI)和面向切面编程(AOP)等功能,...

    Spring对于业务层的单元测试支持

    Spring通过其TestContext框架和JUnit的集成,提供了便捷的单元测试支持。在`spring junit测试.docx`中,你可以了解到如何利用`@RunWith(SpringRunner.class)`注解启动Spring测试环境,以及如何使用`@Autowired`注解...

    SpringBoot中整合Junit测试示例源码

    Spring Boot提供了与Junit的紧密集成,使得我们可以轻松地创建和运行测试用例,从而确保我们的应用代码的质量。以下是对这个主题的详细阐述: 一、Spring Boot与JUnit的集成 Spring Boot默认集成了JUnit 5,这使得...

    Spring测试框架.rar

    Spring测试框架是Spring生态系统中的重要组成部分,它为开发者提供了对Spring应用进行单元测试、集成测试以及端到端测试的强大支持。这个压缩包“Spring测试框架.rar”包含了与使用Spring 2.5 TestContext测试框架...

    Spring 测试jar

    2. `JUnit`:一个广泛使用的单元测试框架,Spring Test与JUnit深度集成,提供测试注解如`@Test`,`@Before`,`@After`等。 3. `MockitoJUnitRunner`或`SpringRunner`:这两个运行器分别来自Mockito和Spring,帮助...

    Spring3单元测试和集成测试

    在Spring3中,我们可以使用JUnit作为基础测试框架,配合Spring的`@ContextConfiguration`注解加载应用上下文,`@Autowired`注解注入依赖,以及`@Test`注解定义测试方法。例如,我们可以创建一个测试类,通过`@...

Global site tag (gtag.js) - Google Analytics