8.3.1. Context管理和缓存
Spring 中的包 spring-mock.jar 为集成测试提供了一流的支持。所有相关的API在包 org.springframework.test 中,它们不依赖于任何应用服务器或者其他部署环境。
test包里的各种抽象类提供了如下的功能:
- 各测试案例执行期间的Spring IoC容器缓存。
- 测试fixture自身的依赖注入。
- 适合集成测试的事务管理。
- 继承而来的对测试有用的各种实例变量。
test包对加载的Context提供缓存,缓存功能是通过 AbstractDependencyInjectionSpringContextTests 类的一个方法(如下)实现的,此方法提供contexts xml的位置,且实现这个方法的类必须提供一个包含XML配置文件位置数组。缺省情况下,一旦加载后,这些配置将被所有的测试案例重用。
protected abstract String[] getConfigLocations();
当配置环境受到破坏,AbstractDependencyInjectionSpringContextTests 的 setDirty() 方法可以用来重新加载配置,并在执行下一个测试案例前重建application context。
8.3.2. 测试fixture的依赖注入
AbstractDependencyInjectionSpringContextTests 类将从getConfigLocations()方法指定的配置文件中自动查找你要测试的类, 并通过Setter注入该类的实例。
简单例子
public class HibernateTitleDaoTests extends
AbstractDependencyInjectionSpringContextTests {
// 被测试类的实例将被(自动的)依赖注入
private HibernateTitleDao titleDao;
// 一个用来实现'titleDao'实例变量依赖注入的setter方法
public void
setTitleDao (HibernateTitleDao titleDao) {
this.titleDao = titleDao;
}
public void testLoadTitle() throws Exception {
Title title = this.titleDao.loadTitle(new Long10));
assertNotNull(title);
}
//指定Spring配置文件加载这个fixture
protected String[]
getConfigLocations() {
return new String[] { "classpath:com/foo/daos.xml" };
}
}
getConfigLocations() 使用的是 根据类型的自动装配(autowire byType)来注入的,所以如果你有多个bean都定义为一个类型,则对这些bean你不能用这个方法。在这种情况下你要使用 applicationContext 实例变量,并且使用 getBean() 来进行显式查找。
如果你的测试案例不使用依赖注入,只要不定义任何setters方法即可; 或者你可以继承 org.springframework.test.AbstractSpringContextTests 类,它只包括用来加载Spring Context的便利方法,并且在测试fixture中不进行依赖注入。
8.3.3. 事务管理
测试对持久存储的数据会有改动。类 AbstractTransactionalDataSourceSpringContextTests 在缺省情况下,对每一个测试案例,他们创建并且回滚一个事务。所以使用这个类就不用担心数据被修改;它依赖于Application Context中定义的一个bean PlatformTransactionManager。
如果你确实想在测试时修改数据,可以用这个类的
setComplete() 方法,这将提交而不是回滚事务。另外,
endTransaction() 方法可以在测试结束前中止事务。
8.3.4. 方便的变量
AbstractDependencyInjectionSpringContextTests 类提供了两个保护属性性实例变量:
- applicationContext (a ConfigurableApplicationContext): 可以利用它进行显式bean查找,或者作为一个整体来测试这个Context的状态。
- jdbcTemplate : 对确定数据状态的查询很有用。
8.3.5. 示例
Spring的PetClinic实例展示了这些测试超类的用法
public abstract class AbstractClinicTests extends
AbstractTransactionalDataSourceSpringContextTests {
protected Clinic clinic;
public void setClinic(Clinic clinic) {
this.clinic = clinic;
}
public void testGetVets() {
Collection vets = this.clinic.getVets();
assertEquals('JDBC query must show the same number of vets',
jdbcTemplate.queryForInt('SELECT COUNT(0) FROM VETS'),
vets.size());
Vet v1 = (Vet) EntityUtils.getById(vets, Vet.class, 2);
assertEquals('Leary', v1.getLastName());
assertEquals(1, v1.getNrOfSpecialties());
assertEquals('radiology', ((Specialty) v1.getSpecialties().get(0)).getName());
Vet v2 = (Vet) EntityUtils.getById(vets, Vet.class, 3);
assertEquals('Douglas', v2.getLastName());
assertEquals(2, v2.getNrOfSpecialties());
assertEquals('dentistry', ((Specialty) v2.getSpecialties().get(0)).getName());
assertEquals('surgery', ((Specialty) v2.getSpecialties().get(1)).getName());
}
JdbcTemplate 变量用于验证被测试的代码是否正确。JdbcTemplate 让测试更严密,且减少了对测试数据的依赖。例如,可以在不中止测试的情况下在数据库里增加额外的数据行。
PetClinic应用支持四种数据访问技术--JDBC、Hibernate、TopLink和JPA ,因此 AbstractClinicTests 类不指定Context位置,这个操作在子类中实现:
例如,用Hibernate实现的PetClinic测试包含如下方法:
public class HibernateClinicTests extends AbstractClinicTests {
protected String[] getConfigLocations() {
return new String[] {
'/org/springframework/samples/petclinic/hibernate/applicationContext-hibernate.xml'
};
}
}
8.3.6. 运行集成测试
集成测试比单元测试更依赖于测试环境,它是测试的一个补充,而不是代替单元测试的。这种依赖主要指完整数据模型的数据库。也可以通过DbUnit或者数据库工具来导入测试数据。
分享到:
相关推荐
本文将详细讲解Spring集成测试工具的使用和重要性。 首先,集成测试是在所有组件被组装到一起后进行的测试,目的是发现模块间的接口问题。Spring提供了一些工具和库,如Spring Test、Spring Boot Test和Mockito,来...
自己研制的spring 集成测试类。希望对大家有一定的帮之。我使用的是注解的spring
在进行Spring集成测试时,重要的是要确保测试环境尽可能接近生产环境,但又不会受到生产数据或复杂性的干扰。理解并熟练运用上述知识点,可以有效地提高测试覆盖率,保证代码质量,并加速软件开发的迭代流程。
在Spring框架中集成JavaMelody,可以让我们在开发和运维过程中更方便地了解应用的健康状况,及时发现并解决问题。 集成JavaMelody到Spring项目中,首先需要在项目的Maven或Gradle构建文件中添加JavaMelody的依赖。...
xml的解析文件,jdk1.4以上的要用高版本的xml的解析文件 博文链接:https://zmfkplj.iteye.com/blog/220115
如何将Spock模拟注入到Spring集成测试中该项目旨在用作示例指南,以说明如何将Spock与Spring(和Spring Boot)结合使用,并结合使用Spring配置和Spock模拟。 有时,您想使用整个Spring上下文进行更完整的集成测试。 ...
Spring Boot 单元测试和集成测试实现详解 Springs Boot 是一个基于 Java 的框架,提供了一个便捷的方式来开发基于 Spring 的应用程序。在开发过程中,测试是一个非常重要的步骤,单元测试和集成测试是其中的两种...
当我们谈论“Spring2集成测试”,我们指的是利用Spring框架提供的工具和最佳实践来测试整个应用程序的集成部分,确保各个组件协同工作。 集成测试是软件开发过程中的关键步骤,它位于单元测试之后,系统测试之前,...
在Spring框架中,单元测试和集成测试是软件开发过程中不可或缺的部分。它们确保代码的质量和功能的正确性。本文将深入探讨Spring3中的单元测试和集成测试,并提供相关的实践指导。 ### 单元测试 单元测试是指针对...
10. **Spring集成测试**:Spring提供了强大的测试支持,包括单元测试、集成测试和端到端测试。`@Autowired`注解可以自动注入依赖,`@SpringBootTest`注解可以启动整个Spring应用上下文进行集成测试。 11. **Spring ...
介绍这个项目的主要目标是使编写基于PostgreSQL数据库的Spring支持的集成测试变得更加容易。 该库负责根据测试配置为每个测试类或测试方法创建和管理隔离的嵌入式数据库。产品特点支持Spring和Spring Boot框架支持的...
10. **Spring集成测试**:学习如何使用JUnit、Mockito和Spring Test进行单元测试和集成测试。 这个课件对于希望深入理解Spring框架的开发者来说,是一个宝贵的资源。通过逐步学习和实践,开发者可以熟练掌握Spring...
此外,文档还提供了一些参考链接,包括基于TestNG+Mockito及自动装配注解的SpringMVC集成测试、Spring+Dubbo+TestNG接口测试的介绍,以及TestNG和Mockito的官方网站。通过这些链接,开发者可以获取更多关于TestNG和...
- **注解**:Spring集成测试中使用的注解。 - **Spring TestContext框架**:Spring提供的测试框架。 - **Spring MVC测试框架**:针对Spring MVC的测试框架。 - **WebTestClient**:Spring WebFlux中的测试工具。...
1. **集成Socket服务**:在Spring中集成Socket服务,我们通常会使用`java.net.ServerSocket`类来创建服务器端的Socket,并通过`java.net.Socket`处理客户端连接。为了将Socket服务与Spring框架结合,我们可以创建一...
在Spring框架中进行集成测试是确保应用程序在各个组件协同工作时仍能正常运行的重要步骤。集成测试关注的是系统中各个组件间的交互,而非单一组件的功能。以下是对在Spring中进行集成测试的详细讲解: 首先,集成...
drools6.4+spring集成是一项将业务规则引擎Drools与Spring框架相结合的技术实践,旨在利用Drools的强大规则处理能力,结合Spring的灵活应用管理,构建高效、可维护的业务系统。在这个项目实例中,我们将深入探讨如何...