利用spring来进行集成测试:
1、AbstractSpringContextTests类[1],该类全部方法是protected的,通常不使用这个类,而使用它的子类们。
2、AbstractDependencyInjectionSpringContextTests类[2]:继承于类[1]:名字N长的。如果仅仅使用Spring依赖注入功能,可以让测试用例继承该类。
3、AbstractTransactionalSpringContextTests类[3]:继承于类[2],继承该类的测试用例在spring管理的事务中进行,测试完后对数据库的记录不会造成任何影响。你对数据库进行一些操作后,它会自动把数据库回滚,这样就保证了你的测试对于环境没有任何影响
4、AbstractTransactionalDataSourceSpringContextTests:继承于类[3],功能更强大,用于测试持久层组件,看其源代码,有一行"protected JdbcTemplate jdbcTemplate;",提供了一个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的便利方法但没有自动依赖注入的功能。
相关推荐
这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在的问题,提高软件的可靠性和可维护性。 首先,让我们了解Spring MVC的基本概念。Spring MVC...
2. **JUnit集成**: JUnit与Spring的结合使得测试更加方便。例如,可以使用`@Autowired`注解自动注入依赖,避免了手动创建对象。同时,`@Test`注解标记测试方法,`@Before`和`@After`注解分别用于定义在每个测试...
这个压缩包文件“java_junit集成_亲测可用_含有jar包以及源码”提供了集成 JUnit 的实例代码,包括必要的 jar 包和源码,便于开发者参考和学习。 首先,我们来深入了解一下 JUnit。JUnit 提供了一组注解(如 @Test...
Spring4与JUnit的结合使得我们可以创建集成测试,验证整个Spring应用的组件之间是如何协作的。通过`@Autowired`注解,我们可以注入需要测试的服务或者bean,然后在测试方法中调用它们。例如: ```java @RunWith...
本文详细介绍了 Spring Boot 中的单元测试和集成测试的实现细节,包括使用 JUnit 和 Hamcrest 框架来进行单元测试,以及使用@SpringBootTest 注解来标记集成测试。这对于学习 Spring Boot 和测试有重要参考价值。
Spring Junit是一个常用的单元测试框架,它可以与Spring框架集成,提供了许多有用的注解和工具来简化单元测试的过程。然而,在使用Spring Junit进行单元测试时,可能会遇到加载配置文件失败的问题。本文将详细介绍这...
博主可能还会讨论在Spring 2.x中遇到的挑战,比如JUnit3与Spring的集成,以及如何在没有注解支持的情况下管理测试环境。此外,可能还会提及升级到JUnit4或其他现代测试库的可能性和步骤,因为这在当时是一个常见的...
在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的质量,提前发现潜在问题,并且便于持续集成和重构。本篇内容将基于"27. Spring Boot Junit单元测试【从零开始学Spring Boot】"的...
- **@RunWith(SpringJUnit4ClassRunner.class)**:这个注解将JUnit测试类与Spring TestContext框架关联起来,使Spring能够管理测试环境。 - **@ContextConfiguration**:此注解用于指定测试所需的配置文件,Spring...
在Spring框架中,我们可以利用JUnit、TestNG等测试框架,结合Spring的测试支持类库,进行集成测试。 首先,我们需要理解Spring的测试注解,如`@RunWith(SpringRunner.class)`,这个注解用于启动Spring的测试环境。`...
在Spring框架中,单元测试和集成测试是软件开发过程中不可或缺的部分。它们确保代码的质量和功能的正确性。本文将深入探讨Spring3中的单元测试和集成测试,并提供相关的实践指导。 ### 单元测试 单元测试是指针对...
在Spring框架中,集成测试是确保各个组件协同工作并达到预期功能的重要环节。Spring提供了丰富的工具和支持来简化集成测试过程,让开发者能够高效地验证应用的各个部分如何一起工作。以下是一些关于在Spring中进行...
5. **数据库集成测试**: 对于涉及到数据库操作的Web工程,Spring还提供了`@DataJpaTest`和`@Sql`注解进行数据库层面的测试。`@DataJpaTest`用于JPA实体的测试,而`@Sql`可以执行SQL脚本,以准备测试数据或清理数据...
通过Spring集成单元测试,以后测试service层内容时,就不用getBean()来获得Service层对象了
6. **集成测试**:除了单元测试,还可以进行集成测试,检查模块间的交互。这可能涉及启动OSGi容器并在其中运行测试。 7. **持续集成**:最后,将这些测试集成到持续集成服务器(如Jenkins、Travis CI等),确保每次...
集成Spring、JUnit4和Ant进行测试时,我们需要做以下步骤: 1. **设置测试环境**:在Spring配置文件中声明需要测试的bean,并通过@Autowired注解注入依赖。这使得测试类可以直接使用这些bean,无需手动实例化。 2....
在Spring框架中,JUnit是广泛使用的单元测试工具,它与Spring的集成使得我们可以方便地进行基于Java的测试。本文将深入探讨如何在Spring环境中利用JUnit进行"Hello, World!"的测试,同时也涉及到一些源码分析和测试...
10. **扩展性与兼容性**:JUnit4设计得非常开放,可以通过实现`Runner`接口来扩展其功能,例如SpringJUnit4ClassRunner可以结合Spring框架进行测试。同时,JUnit4与大多数IDE和构建工具(如Maven、Gradle)良好集成...
在Spring框架中,集成测试是一个重要的环节,用于验证各个组件之间的交互以及系统级别的功能。本文将详细讲解Spring集成测试工具的使用和重要性。 首先,集成测试是在所有组件被组装到一起后进行的测试,目的是发现...