`
喜马拉雅上的小草
  • 浏览: 50893 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

利用spring的mock类进行单元测试

 
阅读更多

link: http://blog.csdn.net/shimiso/archive/2010/07/13/5731438.aspx

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.javaeye.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 Boot中的单元测试.pdf

    首先,要开始在Spring Boot项目中进行单元测试,你需要引入`spring-boot-starter-test`依赖。这个起步依赖包含了多个测试相关的库,如JUnit、Spring Test、Mockito、AssertJ、Hamcrest、JsonPath和JSONassert。这些...

    spring MVC junit 单元测试(controller)

    在Spring MVC中,我们可以利用Spring的TestContext框架和MockMVC库来模拟HTTP请求,对Controller进行隔离测试。 进行Spring MVC Controller的单元测试,我们需要以下步骤: 1. **配置测试环境**:引入Spring Test...

    Spring整合Junit框架进行单元测试Demo

    本篇文章将详细介绍如何在Spring环境中利用JUnit进行单元测试,以及在这个过程中可能遇到的关键知识点。 首先,我们需要了解Spring是如何提供测试支持的。Spring提供了`@ContextConfiguration`和`@Autowired`等注解...

    spring整合单元测试Junit开发包

    Spring框架是Java应用程序开发中的一个...在实际开发中,利用Spring Test和JUnit的组合,开发者可以编写出高效、全面的测试用例,确保代码的正确性和系统的稳定性。理解并熟练运用这些知识点对于提升软件质量至关重要。

    Spring3单元测试和集成测试

    单元测试是指针对代码中的最小可测试单元进行的测试,通常是一个方法。在Spring3中,我们可以使用JUnit作为主要的测试框架,结合`@RunWith(SpringJUnit4ClassRunner.class)`注解来启动Spring上下文,使得测试类能够...

    Junit 单元测试完整案例

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

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

    其中,Spring对于业务层的单元测试和集成测试提供了丰富的工具和功能,使得开发者能够更加高效地对代码进行验证和调试。本文将深入探讨Spring如何帮助我们进行业务层的测试。 首先,单元测试主要关注的是单个类或...

    Struts2SpringUnitDemo单元测试

    在Struts2SpringUnitDemo中,Action类通常会与Spring的bean进行整合,以便利用Spring的依赖注入。 2. **Spring框架**:Spring是Java企业级应用的基石,提供了一个全面的编程和配置模型,支持事务管理、数据访问、...

    27. Spring Boot Junit单元测试【从零开始学Spring Boot】

    单元测试是一种针对软件中的最小可测试单元(如方法)进行的独立验证,目的是确保这些单元按照预期工作。在Java世界里,JUnit是最常用的单元测试框架,它提供了一套简洁的API来编写和运行测试用例。 Spring Boot...

    SpringBoot 多模块 Serivce 层单元测试

    本文将深入探讨如何在IDEA中对Spring多模块项目中的Service层进行单元测试。 首先,我们需要理解Spring Boot的多模块架构。一个标准的Spring Boot多模块项目通常包括以下部分:父模块(parent)、应用主模块...

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

    本文将深入探讨如何利用Spring管理的Web工程进行单元测试,以及如何借助工具提升测试效率。 首先,理解“通过Spring管理”的含义至关重要。这意味着我们的测试将依赖于Spring的IoC(Inversion of Control)容器来...

    spring单元测试

    总结起来,通过Java配置的Spring Web项目,我们可以利用JUnit、Mockito以及H2数据库轻松地进行单元测试。对于Controller层,我们使用`@WebMvcTest`注解;对于Service层,我们结合`@MockBean`和`@Autowired`创建mock...

    Spring Boot中的单元测试.docx

    Spring Boot为单元测试提供了便利,通过引入`spring-boot-starter-test`依赖,我们可以轻松地进行各种类型的测试。 首先,让我们看看如何引入`spring-boot-starter-test`。这个起步依赖包包含了多个测试相关的库,...

    SSM中进行单元测试Junit4+spring-test所需jar包

    引入spring-test模块(通常为spring-test-4.x.x.jar或更高版本)后,可以更方便地对Spring组件进行隔离测试,同时能够利用Spring的IoC特性。 要进行SSM项目的单元测试,你需要做以下几步: 1. **添加依赖**:在你...

    Spring中进行集成测试

    1. **Spring Test Framework**:Spring Test模块为Spring应用程序提供了一个统一的测试平台,它包括了`@RunWith(SpringRunner.class)`注解,允许JUnit测试类利用Spring的IoC容器进行初始化。通过这个注解,你可以将...

    spring-demo15-测试.zip

    单元测试主要关注代码的最小可测试单元,如方法。在Spring中,我们可以使用`@RunWith(SpringRunner.class)`注解来运行测试类,同时用`@ContextConfiguration`或`@SpringBootTest`注解加载相应的上下文配置。这样,...

    unitils整合dbunit利用excel进行单元测试

    unitils整合dbunit利用excel进行单元测试 包含mock以及整合spring进行测试

    单元测试案例junit +spring mvc +springboot

    在进行单元测试时,可以利用Spring MVC的MockMvc类来模拟HTTP请求,测试控制器方法的行为,而无需实际启动服务器。 3. Spring Boot Spring Boot旨在简化Spring应用的初始搭建以及开发过程。它通过预设合理的默认...

    spring测试示例代码

    本示例代码聚焦于使用JUnit进行Spring测试,这是一项核心的Java测试框架,广泛用于编写可重复的、独立的单元测试。 首先,让我们深入理解Spring测试的基本概念。Spring测试支持主要由`spring-test`模块提供,它包含...

Global site tag (gtag.js) - Google Analytics