利用spring的mock类进行单元测试:
spring框架提供了大量测试的mock类,包括与jndi,porlet,web应用相关的mock类。尤其是web应用相关的mock类,可以大大提高web组件测试的方便性。
打开spring的下载包的mock文件夹(路径...mock\org\springframework\mock\web),就发觉有如下几个文件:
MockHttpServletRequest:是HttpServletRequest接口的mock实现,用来模拟客户端的HTTP请求,很常用的一个类。
MockHttpServletResponse:是HttpServletResponse接口的mock实现,用于模拟服务器对客户端的响应。
MockHttpSession:是对HttpSession接口的mock实现。
DelegatingServletInputStream:是对ServletInputStream接口的mock实现。
DelegatingServletOutputStream:ServletOutputStream的mock实现。需要拦截和分析服务器的输出的流的内容,可以使用该类。
其他的,例如MockFilterConfig,MockPageContext(可以测试预编译的JSP),MockRequestDispatcher,MockServletConfig看名称就知道大概是mock什么的。
举一个例子:
MockHttpServletRequest request = new MockHttpServletRequest("POST","/index.do");
request.addParameter("username","name");
request.addParameter("password","word");
利用spring来进行集成测试:
1、AbstractSpringContextTests类[1],该类全部方法是protected的,通常不使用这个类,而使用它的子类们。
2、AbstractDependencyInjectionSpringContextTests类[2]:继承于类[1]:名字N长的。如果仅仅使用Spring依赖注入功能,可以让测试用例继承该类。
3、AbstractTransactionalSpringContextTests类[3]:继承于类[2],继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。你对数据库进行一些操作后,它会自动把数据库回滚,这样就保证了你的测试对于环境没有任何影响
4、AbstractTransactionalDataSourceSpringContextTests:继承于类[3],功能更强大,用于测试持久层组件,看其源代码,有一行"protected JdbcTemplate jdbcTemplate;",提供了一个JdbcTemplate的变量,通过该对象可以直接操作数据库。
http://lighter.iteye.com/blog/41733 还提供了两个用spring来进行集成测试(对数据库操作进行测试),业务测试(对业务层进行测试)的例子供下载。
***如何在你的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的便利方法但没有自动依赖注入的功能。
另外还有一篇文章介绍了spring单元测试的策略,见http://blog.csdn.net/wangjian5748/archive/2006/09/09/1199549.aspx
分享到:
相关推荐
总之,Spring的JUnit测试提供了一种高效、便捷的方式来验证Spring应用中的组件。通过理解和使用这些工具,我们可以更好地保证代码质量,提高开发效率。同时,了解其背后的源码和工作原理也有助于我们成为更优秀的...
这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在的问题,提高软件的可靠性和可维护性。 首先,让我们了解Spring MVC的基本概念。Spring MVC...
标题中的“spring junit”指的是Spring框架与JUnit测试框架的结合使用。在Java开发中,单元测试是确保代码质量的重要步骤,而JUnit是最流行的Java单元测试框架。Spring框架提供了丰富的功能,包括依赖注入、AOP...
单元测试—— Spring 环境下测试,所需要的jar包: spring-test-4.3.29.RELEASE.jar、junit-4.13.1.jar、hamcrest-core-1.3.jar。
SpringJUnit就是一种结合了Spring框架和JUnit测试工具的解决方案,它为基于Spring的应用程序提供了强大的单元测试支持。下面我们将深入探讨SpringJUnit的相关知识点。 首先,JUnit是Java编程语言中最常用的单元测试...
- **@RunWith(SpringJUnit4ClassRunner.class)**:这个注解将JUnit测试类与Spring TestContext框架关联起来,使Spring能够管理测试环境。 - **@ContextConfiguration**:此注解用于指定测试所需的配置文件,Spring...
基于Spring的JUnit4单元测试
标题“spring2 junit3”指的是在Spring框架的第二个主要版本中使用JUnit3进行单元测试的相关内容。这篇博文可能探讨了如何在Spring 2.x时代利用JUnit3进行测试驱动开发(TDD),因为JUnit3是当时广泛使用的Java单元...
《Spring4与JUnit的简单测试实践》 在Java开发领域,Spring框架以其强大的功能和灵活性深受开发者喜爱。Spring4作为其一个重要的版本,引入了许多改进和优化,使得测试变得更加便捷。而JUnit作为Java单元测试的事实...
这里的`SpringJUnit4ClassRunner`是JUnit的扩展,它会启动Spring容器并初始化测试类中的bean。 接着,我们可以使用`@Autowired`注解来自动注入需要的依赖。假设我们有一个`MyService`服务需要在测试中使用: ```...
在Java开发领域,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)框架之一,而JUnit则是Java语言中进行单元测试的标准库。本篇文章将详细探讨如何在Spring环境中利用...
在案例中,你将看到如何创建测试类,定义测试方法,设置测试数据,以及如何利用JUnit和Spring/Struts提供的工具来编写高效的单元测试。通过分析和运行源码,你可以了解如何将这些概念应用于实际项目,提高代码质量。...
在这些类中,你可以使用`@RunWith(SpringJUnit4ClassRunner.class)`注解来表明测试需要Spring Test的支持。 3. **定义测试上下文**:使用`@ContextConfiguration`注解来指定包含被测试组件的Spring配置文件。这样,...
Spring Boot Junit单元测试【从零开始学Spring Boot】"的主题,深入探讨Spring Boot中Junit单元测试的使用方法和最佳实践。 首先,我们要了解什么是单元测试。单元测试是一种针对软件中的最小可测试单元(如方法)...
4. **运行测试**:通过命令行或者IDE运行Ant任务,Ant会执行JUnit测试,并将结果输出到指定的目录下。 5. **查看测试报告**:Ant可以生成JUnit测试报告,通常为HTML格式,这样我们就可以直观地看到每个测试用例的...
在整合 `JUnit` 进行测试时,我们需要使用 `Spring` 的测试支持,如 `@ContextConfiguration` 注解来加载配置文件,创建测试所需的 `ApplicationContext`。这样,`Spring` 会自动管理 `DAO` 实例,我们可以在测试...
Spring Junit单元测试加载配置文件失败问题解决方法 在软件开发过程中,单元测试是一个非常重要的步骤,它可以帮助开发者检测代码中的错误、提高代码的可靠性和稳定性。Spring Junit是一个常用的单元测试框架,它...
本压缩包文件"javaweb中.java文件测试需要的框架(junit测试).rar"显然是为了帮助开发者理解如何在Java Web项目中使用JUnit进行测试。 **JUnit框架详解** JUnit是一个基于注解的测试框架,它的核心功能包括: 1....
Java Spring Junit System-Rules 1.16.1 是一个专门为Java开发人员设计的测试框架扩展,它在Spring和JUnit的基础上提供了一组强大的规则,用于处理系统级别的测试。System-Rules库允许开发者在单元测试中更有效地...
10. **扩展性与兼容性**:JUnit4设计得非常开放,可以通过实现`Runner`接口来扩展其功能,例如SpringJUnit4ClassRunner可以结合Spring框架进行测试。同时,JUnit4与大多数IDE和构建工具(如Maven、Gradle)良好集成...