Spring-Context之二:使用Spring提供的测试框架进行测试

Spring框架是无侵入性的,所以你的代码可以完全是POJO(plain old java object),直接使用Junit就可以完成大部分的单元测试。但是在集成测试方面就比较吃力了。单元测试层面你可以mock一些依赖对象,但是集成测试时需要真实的依赖对象,而这些对象都是在Spring容器的控制之下。那么如何在引入了Spring的情况下进行集成测试那?别着急,Spring框架早为我们想到了这点,本身提供了集成测试的功能。

就拿上一次那个简单的例子来做实验吧。

首先引入对junit以及spring-test库的依赖。

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
   <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.0.2.RELEASE</version>
        </dependency>
    </dependencies>

spring-test模块是专门为使用了spring框架的项目进行集成测试的辅助类库。其有以下几个目的。

  • 提供在运行测试时对Spring IOC容器的缓存,提高集成测试速度。
  • 对测试实例提供依赖注入功能。
  • 集成测试中提供事务管理。
  • 提供一些辅助类库帮助开发者更好的编写集成测试。

然后新建一个ApplicationTest.java类,代码如下所示。

ApplicationTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package huangbowen.net;

import huangbowen.net.service.Cinema;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.assertNotNull;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Application.class})
public class ApplicationTest {

    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private Cinema cinema;

    @Test
    public void shouldGetCinemaInstance()  {
        Cinema cinema = applicationContext.getBean(Cinema.class);
        assertNotNull(cinema);
    }

    @Test
    public void shouldGetAutowiredCinema() {
        assertNotNull(cinema);
    }

    @Test
    public void shouldGetMovieServiceInstance() {
        assertNotNull(cinema.getMovieService());
        assertThat(cinema.getMovieService(), instanceOf(DefaultMovieService.class));
    }
}

在本例中ApplicationTest有两个注解。@RunWith(SpringJUnit4ClassRunner.class).是Spring TestContext 框架提供的一个自定义的JUnit runner,这样在测试类中就可以获取ApplicationContext,甚至直接进行依赖注入,使用事务控制测试方法执行等。声明了@RunWith(SpringJUnit4ClassRunner.class)以后一般还要声明@ContextConfiguration注解。这个注解是用于告诉测试类本项目中的Spring配置。这里我们传入Application.class类,因为这个类中配置了Spring的bean。

然后就可以在测试类中使用强大的@Autowired功能了。我们写了三个测试方法,第一个是通过Autowired功能拿到ApplicationContext,第二个是通过Autowired功能直接拿到cinema,第三个则是验证Cinema中的MovieService是被正确注入了的。

Ok,今天就到这里。本例中的源码请在我的GitHub上自行下载。

时间: 2024-10-09 16:43:51

Spring-Context之二:使用Spring提供的测试框架进行测试的相关文章

spring context架构--静态结构

概念 Context也就是我们常说的spring容器,打个比方,context就像是一家公司,beans则是公司的工厂,除了工厂,公司还有翻译,仓库以及办公场所等等. 下面就看看context的主要构成部件. Context构成部件 上图是ApplicationContext的实体静态结构,它继承了六个实体.虽然是继承,但其实context和他们的关系更像是聚合.Spring使用继承主要是为了在context上也同时体现这6个实体的特征.在实现层面,context事实上是个包装类,最终通过聚合的

java-JAVA问题:关于Spring框架中提供的测试框架

问题描述 JAVA问题:关于Spring框架中提供的测试框架 这是教程视频中截的图,备注上说了,这个注解括号里的参数填源码编译后的路径(web中就是classes,普通项目就是bin),而下面的实际操作中,他怎么把Spring配置文件的路径填进去了,不太理解,这是为什么??? 解决方案 spring是一个容器 通过 xml 管理bean 所以 他的路径可以在xml里定义 解决方案二: spring 测试框架Spring TestContext 测试框架

web项目在eclipse中运行正常 部署到tomcat中运行报spring context错误

问题描述 web项目在eclipse中运行正常 部署到tomcat中运行报spring context错误 20C 解决方案 quatrz配置有问题参考:http://blog.csdn.net/kingzuo/article/details/12572881http://www.cnblogs.com/kay/archive/2007/11/02/947372.html

【报错】spring整合activeMQ,pom.xml文件缺架包,启动报错:Caused by: java.lang.ClassNotFoundException: org.apache.xbean.spring.context.v2.XBeanNamespaceHandler

spring版本:4.3.13 ActiveMq版本:5.15 ======================================================== spring整合activeMQ,pom.xml文件缺架包,启动报错: [springDemo][INFO] [2017-12-11 14:54:57] org.springframework.web.context.ContextLoader.initWebApplicationContext(304) | Root

spring入门(3) spring加载配置web

Spring初始化容器.三种经常用到的实现: 一.ClassPathXmlApplicationContext:从类路径中加载. 二 .FileSystemXmlApplicationContext:从文件系统加载. 三.XmlWebApplicationContext:从web系统中加载. 使用1.bean工厂:最简单的容器,提供了基础的依赖注入支持.创建各种类型的Bean. BeanFactory factory = null ; //声明 ClassPathResource resourc

【spring源码学习】spring的远程调用实现源码分析

[一]spring的远程调用提供的基础类 (1)org.springframework.remoting.support.RemotingSupport ===>spring提供实现的远程调用客户端实现的基础类 ===>例子:org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean org.springframework.remoting.caucho.HessianProxyFactoryBean (2)org.

Spring Boot——2分钟构建spring web mvc REST风格HelloWorld

Spring Boot--2分钟构建spring web mvc REST风格HelloWorld 之前有一篇<5分钟构建spring web mvc REST风格HelloWorld>介绍了普通方式开发spring web mvc web service.接下来看看使用spring boot如何快速构建一个.   Spring Boot使我们更容易去创建基于Spring的独立和产品级的可以"即时运行"的应用和服务.支持约定大于配置,目的是尽可能快地构建和运行Spring应

Spring入门指引之理解Spring的打包方式

打包 获取Spring发布包之后,你或许会惊讶的发现:Spring开发小组并没有用单个JAR文件来包含所有代码,而是选择建立包含有完整发布的单个JAR和8个独立JAR文件来包含对应的Spring组件.未来版本的组件JAR文件数量很可能会有所增加,可令你更加自如的选择自己的代码要包含的特性. 完整发布包 所有发布版本都提供spring.jar文件,它差不多包含Spring framework类的完整发布包.之所以说"差不多"是因为它实际上并未包含任何mock类,这些类随Spring一起发

Spring入门指引:理解Spring的打包方式

打包 获取Spring发布包之后,你或许会惊讶的发现:Spring开发小组并没有用单个JAR文件来包含所有代码,而是选择建立包含有完整发布的单个JAR和8个独立JAR文件来包含对应的Spring组件.未来版本的组件JAR文件数量很可能会有所增加,可令你更加自如的选择自己的代码要包含的特性. 完整发布包 所有发布版本都提供spring.jar文件,它差不多包含Spring framework类的完整发布包.之所以说"差不多"是因为它实际上并未包含任何mock类,这些类随Spring一起发