Spring之单元测试

  引言

  是否在程序运行时使用单元测试是衡量一个程序员素质的一个重要指标。使用单元测试既可以让我检查程序逻辑的正确性还可以让我们减少程序测试的BUG,便于调试可以提高我们写程序的效率。以前我们做单元测试的时候使用的都是JUnit,只需要引入相关的jar包即可。可是我们在使用Spring的时候是不是也可以使用单元测试呢,答案是肯定的。Spring自己整合了JUint,极大的方便了我们的程序开发。

  1.引入相关环境

  如果我们想要使用Spring提供的单元测试功能,我们除了引入Spring的相关环境我们还需要引入spring单元测试的jar包,使用maven配置是

  

<dependency>
    <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>3.2.10.RELEASE</version>
</dependency></span>

  2.使用示例

  我们紧接着上次的实验结果,上次我们是通过FactoryBean的方式来加载Spring的环境并且实现了注入功能,那我们能不能直接通过单元测试的方式来实现的,看下面的例子:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import service.Hello;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext.xml"})
public class TestDemo2 {

    @Resource
    Hello hello;

    @Test
    public void testHello(){
        hello.sayHello();
        hello.sayGoodbye();
    }
}

  运行结果:

通过上面的单元测试我们直接测试了我们Service类的功能了。

3.注解解释

  

  @RunWith(SpringJUnit4ClassRunner.class)//指定测试用例的运行器,这里是指定了

@ContextConfiguration({"classpath:applicationContext.xml"})//将spring配置加载进来,可以加载多个,使用数组,可是是classpath路径也可以是File文件路径
@Resource//注入相应的类,注入到Spring的IOC容器中然后就可以直接使用了。(按类型注入)
@Autowied//注入相应的类,功能和@Resource是一样的

@Test//标记这是一个单元测试方法,每个单元测试方法上面都需要加上此注解

除了上面几个注解,Spring单元测试中很多很用的注解下面一次介绍,

@Before//在每个测试用例方法之前都会执行,位置在方法的上面 

@After//在每个测试用例方法之后都会执行,位置在方法的上面 

如果我们测试单元中涉及到事务处理我们是否有办法解决或者是提供支持呢,Spring的单元测试提供了对这些功能的支持。主要是通过以下几个注解来实现的:


@Transactional //对所有的测试方法都使用事务,并在测试完成后回滚事务,这个注解的功能和所处的位置有关系,如果@Transactional所处的位置在类的上面那么就是说对多有的单元测试方法都会使用事务,但是如果是在某一个测试方法的上面那么就只对这个方法才会使用事务,方法执行完毕后默认是进行事务回滚的。

@Rollback(false) //这里设置为false,就让事务不回滚 。如果们在添加了事务支持后不想要事务回滚我们只需要在相应的位置处添加上这个注解即可。如果true表示事务回滚,默认是true。 

4.其他

 

  上面的注解功能基本上可以满足我们的需求了,如果我们不知道@ContextConfiguration注解的功能,我们应该采用上面方式来注入Spring的配置呢。看下面的两个测试例子:UnitTestBase.java


  

import org.junit.After;
import org.junit.Before;
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;

public class UnitTestBase {

    private ClassPathXmlApplicationContext context;

    private String springXmlpath;

    public UnitTestBase() {}

    public UnitTestBase(String springXmlpath) {
        this.springXmlpath = springXmlpath;
    }

    @Before
    public void before() {
        if (StringUtils.isEmpty(springXmlpath)) {
            springXmlpath = "classpath*:applicationContext.xml";
        }
        try {
            context = new ClassPathXmlApplicationContext(springXmlpath.split("[,\\s]+"));
            context.start();
        } catch (BeansException e) {
            e.printStackTrace();
        }
    }

    @After
    public void after() {
        context.destroy();
    }

    @SuppressWarnings("unchecked")
    protected <T extends Object> T getBean(String beanId) {
        try {
            return (T)context.getBean(beanId);
        } catch (BeansException e) {
            e.printStackTrace();
            return null;
        }
    }

    protected <T extends Object> T getBean(Class<T> clazz) {
        try {
            return context.getBean(clazz);
        } catch (BeansException e) {
            e.printStackTrace();
            return null;
        }
    }

}
import org.junit.Test;
import org.junit.runner.RunWith;
import  org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.imooc.ioc.interfaces.OneInterface;
import com.imooc.test.base.UnitTestBase;

@RunWith(SpringJUnit4ClassRunner.class)
public class TestSpringUnit extends UnitTestBase {

    public TestSpringUnit() {
        super("classpath*:applicationContext.xml");
    }

    @Test
    public void testSay() {
        Hello hello = super.getBean("hello");
        hello.sayHello();
    }

}

   由此可见我们这样可以对测试单元进行简单的封装,将一些需要的校验放到@Before中去。通过工具类提供的getBean接口一样可以获取到我们需要的Bean,只是他只是对Spring的FactoryBean进行了一层封装而已。在开发中我们应该直接使用第一种就可以了。

5.感想

  为了程序的健壮性也是最自己代码的负责人我们需要更多的使用单元测试,这是一个很好地习惯。在使用Spring整合的单元测试时多使用注解可以提交工作效率。

时间: 2024-10-07 07:55:02

Spring之单元测试的相关文章

Spring dao单元测试

public class JdbcDao extends JdbcDaoSupport  {     @SuppressWarnings("rawtypes")     public List getTables()     {         List result = super.getJdbcTemplate().query(                 "select username, user_id from dba_users where account_s

Spring Boot 单元测试示例

Spring 框架提供了一个专门的测试模块(spring-test),用于应用程序的单元测试. 在 Spring Boot 中,你可以通过spring-boot-starter-test启动器快速开启和使用它. 在pom.xml文件中引入maven依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artif

使用 Spring 进行单元测试

单元测试和集成测试在我们的软件开发整个流程中占有举足轻重的地位,一方面,程序员通过编写单元测试来验证自己程序的有效性,另外一方面,管理者通过持续自动的执行单元测试和分析单元测试的覆盖率等来确保软件本身的质量.这里,我们先不谈单元测试本身的重要性,对于目前大多数的基于 Java 的企业应用软件来说,Spring 已经成为了标准配置,一方面它实现了程序之间的低耦合度,另外也通过一些配置减少了企业软件集成的工作量,例如和 Hibernate.Struts 等的集成.那么,有个问题,在普遍使用 Spri

web工程spring+ibatis单元测试

web工程spring+ibatis在本地做单元测试,用例如下: 1 package wanghongye; 2 3 import org.junit.Before; 4 import org.junit.Test; 5 6 import richinfo.dbcomponent.service.impl.SqlMapClientBeanFactory; 7 import richinfo.mms.bean.req.MmsDelRecordReq; 8 import richinfo.mms.d

spring boot单元测试(转)

Junit这种老技术,现在又拿出来说,不为别的,某种程度上来说,更是为了要说明它在项目中的重要性.凭本人的感觉和经验来说,在项目中完全按标准都写Junit用例覆盖大部分业务代码的,应该不会超过一半. 刚好前段时间写了一些关于SpringBoot的帖子,正好现在把Junit再拿出来从几个方面再说一下,也算是给一些新手参考了. 那么先简单说一下为什么要写测试用例1. 可以避免测试点的遗漏,为了更好的进行测试,可以提高测试效率2. 可以自动测试,可以在项目打包前进行测试校验3. 可以及时发现因为修改代

maven下使用junit对spring进行单元测试_01基本应用

一.开发环境 maven版本:3.0.5 spring版本:spring3.2.3 release junit版本:4.11 eclipse版本:3.7.2 r2 jdk版本:1.6 二.文件清单 pom.xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <depen

spring mvc 单元测试示例

import java.awt.print.Printable; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired

使用Spring注解方式注入properties文件内容,并配合Junit4+Spring做单元测试

先看看工作目录,然后再来讲解 1.建立config.properties,我的config.properties内容如下: author_name=luolin project_info=该项目主要是用于写一些demo 2.配置Spring配置文件,读取properties文件,并设置编码格式.大家从我的项目结构图中可以看到我用了两个Spring的配置文件,其实在spring-context.xml中没有配置其他内容,只是配置扫描com.eya.property这个包,大家可能会有疑问为何包的扫

Spring Boot单元测试

一个测试类包含下面两个注解: @RunWith(SpringRunner.class) @SpringBootTest 测试类中可直接注入接口: @Resource MyServerMgr myServerMgr; 在方法上加@Test表示它是个测试方法: @Test public void query() { String result = myServerMgr.query(); log.info("test query result is {}.", result); //使用断