原创整理不易,转载请注明出处:Spring整合JUnit框架进行单元测试代码使用详解
代码下载地址:http://www.zuidaima.com/share/1775457756285952.htm
一、Spring提供的JUnit框架扩展:
1. AbstractSpringContextTests:spring中使用spring上下文测试的Junit扩展类,我们一般不会使用这个类来进行单元测试,它是spring内部设计使用到的类
2. AbstractDependencyInjectionSpringContextTests:这是AbstractSpringContextTests的直接子类,支持依赖spring上下文的测试类,这个类不支持事务。
3. AbstractTransactionalSpringContextTests:这是 AbstractDependencyInjectionSpringContextTests的直接子类,这个类一般应用在事务相关的测试中,一旦完成每个测试它就会正常地回滚事务,不会真正更新数据库,若要手动设置事务相关操作,你可以重载onSetUpInTransaction和 onTearDownInTransaction方法,以便手工开始并提交事务,或者调用setComplete()方法。这个类也可以在没有事务的情况下,使用这个类。
4. AbstractTransactionalDataSourceSpringContextTests:这是 AbstractTransactionalSpringContextTests的直接子类,它使用了Spring的基于JDBC的 jdbcTemplate工具类,支持数据库级别的事务。
二、如何在你的TestCase Class里取得spring context
你的TestCase Class必须继承的是上述四个AbstractXXXSpringContextTests中的其中一个,那么就必须实现下面这个方法来取得spring context:
protected abstract String[] getConfigLocations();
例如:
public String[] getConfigLocations() { String[] configLocations = { "applicationContext.xml","hibernate-context.xml" }; return configLocations; }
请 注意要加载的context xml file的路径问题:上述的代码是基于classpath,因此applicationContext.xml和hibernate- context.xml必须放在classpath里(方法一是把xml files放到WEB-INF/classes目录下,另一种方法就是在project properties里把xml files的路径加到classpath里)
那么如果你一定要把context xml files放到WEB-INF目录下,也是可以的,那么应该基于file(基于file的相对路径是相对于project root folder),代码如下:
public String[] getConfigLocations() { String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml"}; return configLocations; }
AbstractXXXSpringContextTests就会根据根据getConfigLocations方法返回的context xml位置的数组来加载并且对加载的Context提供缓存。这是非常重要的,因为如果你在从事一个大项目时,启动时间可能成为一个问题--这不是 Spring自身的开销,而是被Spring容器实例化的对象在实例 化自身时所需要的时间。例如,一个包括50-100个Hibernate映射文件的项目可能需要10-20秒的时间来加载上述的映射文件,如果在运行每个测试fixture里的每个测试案例前都有这样的开销,将导致整个测试工作的延时,最终有可能(实际上很可能)降低效率。
在某种极偶然的情况下,某个测试可能“弄脏”了配置场所,并要求重新加载--例如改变一个bean的定义或者一个应用对象的状态--你可以调用 AbstractDependencyInjectionSpringContextTests 上的 setDirty() 方法来重新加载配置并在执行下一个测试案例前重建application context
当类 AbstractDependencyInjectionSpringContextTests(及其子类)装载你的Application Context时,你可以通过Setter方法来注入你想要的来自context的bean,而不需要显式的调用 applicationContext.getBean(XXX)。因为 AbstractDependencyInjectionSpringContextTests会从getConfigLocations()方法指定的配置文件中帮你自动注入
下面的例子就是通过setter方法来获得context里的ProductManager bean:
public class MyTest extends AbstractDependencyInjectionSpringContextTests { ProductManager productManager; public String[] getConfigLocations() { String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" }; return configLocations; } public void testGetProduct() { assertEquals("tomson",productManager.getProductByName("tomson").getName()); } //通过setter方法自动从context里注入productManager bean,而不用显示调用applicationContext.getBean(XXX) public void setProductManager(ProductManager productManager) { this.productManager = productManager; } }
但是如 果context里有多个bean都定义为一个类型(例如有多个bean都是ProductManager class类型的),那么对这些bean就无法通过setter方法来自动依赖注入(因为有多个bean同一个类型,不知要自动注入哪个)。在这种情况下 你需要显示的调用applicationContext.getBean(XXX)来注入。如:
public class MyTest extends AbstractDependencyInjectionSpringContextTests { ProductManager productManager; public String[] getConfigLocations() { String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" }; return configLocations; } public void onSetUp() { productManager = (ProductManager) applicationContext.getBean("productManager"); } public void testGetProduct() { assertEquals("tomson",productManager.getProductByName("tomson").getName()); } }
如果你的TestCase不使用依赖注入,只要不定义任何setters方法即可。或者你可以继承 AbstractSpringContextTests --这个 org.springframework.test 包中的根类,而不是继承AbstractDependencyInjectionSpringContextTests(及其子类)。这是因为 AbstractSpringContextTests 只包括用来加载Spring Context的便利方法但没有自动依赖注入的功能。
相关推荐
SSM框架中测试单元的使用是指在SSM框架中使用Spring整合JUnit来进行单元测试。单元测试是软件测试的一个重要部分,它可以帮助我们检测代码中的错误和bug,从而提高代码的质量和可靠性。在SSM框架中,我们可以使用...
本文详细介绍了 Spring Boot 中的单元测试和集成测试的实现细节,包括使用 JUnit 和 Hamcrest 框架来进行单元测试,以及使用@SpringBootTest 注解来标记集成测试。这对于学习 Spring Boot 和测试有重要参考价值。
Spring Cloud 提供了多种方式来对应用程序进行单元测试,例如使用 Spring Test 框架、JUnit 框架等。本文将主要介绍如何使用 Spring Test 框架对 Spring Cloud 应用程序进行单元测试。 使用 Spring Test 框架进行...
Spring整合Junit的使用详解 ...Spring整合Junit的使用详解是一个非常重要的知识点,通过使用Spring-test模块,我们可以将Spring框架与Junit框架进行整合,从而实现对Spring应用程序的正确性测试。
**JUnit框架详解** JUnit是一个基于注解的测试框架,它的核心功能包括: 1. **测试注解**:如`@Test`,标记测试方法,`@Before`和`@After`用于定义在每个测试方法之前和之后运行的初始化和清理代码。 2. **断言**...
JUnit是Java开发中最常用的单元测试框架之一,它提供了一种简单的方式来编写可重复执行的测试案例。随着软件复杂度的增加,对于某些功能模块可能需要多次使用不同的输入数据进行验证。此时,传统的JUnit测试方法就...
在Java世界里,Junit是最广泛使用的单元测试框架,它为Java程序员提供了简洁易用的API来进行单元测试。本篇文章将深入探讨Junit的基础、中级和高级应用。 ### 基础篇 1. **安装与配置**:Junit通常作为Maven或...
JUnit4则是单元测试的首选工具,它使得测试代码编写更加简洁,可读性更强。本文将深入探讨这两个关键组件,并结合《Effective Unit Testing》一书中的精华,为开发者提供全面的理论和实践指导。 1. Spring3.2.8框架...
在测试方面,Spring提供了`@ContextConfiguration`和`@Autowired`等注解来协助进行单元测试和集成测试。例如: ```java @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:...
本示例“spring-demo15-测试”主要聚焦于Spring框架中的测试部分,通过一系列的实例,深入探讨如何有效地进行Spring应用的单元测试和集成测试。 1. **Spring测试模块** Spring框架提供了内置的测试支持,包括`...
### Spring+Hibernate 单元测试详解 #### 一、Spring 2.5 TestContext 测试框架简介 Spring 2.5 版本引入了一个全新的基于注解的测试框架——TestContext,该框架与之前的测试框架相比有着显著的区别。TestContext...
在软件开发领域,测试是不可或缺的一部分,而Java开发中的Junit框架则是单元测试的重要工具。结合持久层框架Hibernate和依赖注入框架Spring,可以构建出高效、可维护的业务应用。本工程“junit+hibernate3.2+spring...
- 使用JUnit4编写单元测试,测试Service层和DAO层的功能,确保代码的正确性。 本项目中,开发者已经完成上述步骤,并且所有测试都已通过,这意味着整个系统可以正常运行,实现了基本的CRUD操作。这对于初学者来说是...
Spring 框架各 jar 包详解 Spring 框架中有许多 jar 包,每个 jar 包都有其特定的作用和使用场景。了解每个 jar 包的作用和使用场景对于正确地使用 Spring 框架非常重要。本文将对 Spring 框架中常用的 jar 包进行...
使用JUnit单元测试框架结合Spring Test模块来编写针对Spring组件的测试用例。 2. **Spring Test模块提供的支持** Spring Test模块提供了多种测试支持,如MockMvc用于模拟HTTP请求,以及各种测试注解如@RunWith...
使用JUnit和Mockito等工具进行单元测试,确保每个组件的正确性。在SSM框架中,Spring Test提供了一套完整的测试支持,可以方便地测试Spring的bean和依赖注入。 SSM框架的整合不仅简化了开发工作,也提高了代码的可...
3. **Mockito与Spring集成**:Spring测试模块可以与Mockito等模拟框架集成,方便进行行为驱动开发(BDD)和单元测试。 4. **SpringJUnit4ClassRunner**与**SpringRunner**:这些测试运行器使得JUnit测试类可以利用...
**Spring-SSM框架整合详解** 在Java Web开发领域,Spring、Struts和MyBatis(简称SSM)是常见的三大框架,它们各自专注于不同的层面:Spring提供了强大的依赖注入和面向切面编程功能,Struts则负责处理MVC模式中的...