【Spring】Junit加载Spring容器作单元测试(整理)

本文介绍如何使用Junit配合Spring的测试模块进行单元测试,包括配置文件加载方式、原始及常见用法。通过示例展示了如何避免多次初始化Spring容器、减少硬编码并保护数据库状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【Spring】Junit加载Spring容器作单元测试

 

> 引入相关Jar包

一、均需引入所需的包

复制代码
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
</dependency>

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

复制代码

>配置文件加载方式

(a)加载配置文件<原始的手动加载方式>

ApplicationContext context = new FileSystemXmlApplicationContext("WebRoot/WEB-INF/applicationContext.xml");
new ClassPathXmlApplicationContext("applicationContext.xml");// 从classpath中加载
new FileSystemXmlApplicationContext("classpath:地址");// 没有classpath表示当前目录 

 

(b)注解的方式自动加载方式

1 @org.springframework.test.context.ContextConfiguration(locations={"file:WebRoot/WEB-INF/applicationContext.xml"})
2  
3 @org.springframework.test.context.ContextConfiguration(locations={"classpath:applicationContext.xml"}) 
View Code

 

    @RunWith(SpringJUnit4ClassRunner.class)  //使用junit4进行测试  
    @ContextConfiguration   
    ({"/spring/app*.xml","/spring/service/app*.xml"}) //加载配置文件  
      
    //------------如果加入以下代码,所有继承该类的测试类都会遵循该配置,也可以不加,在测试类的方法上///控制事务,参见下一个实例  
    //这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!  
    //@Transactional  
    //这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时//指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!  
    //@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
    //------------  
    public class BaseJunit4Test {  
    }  

 

 

>原始的用法

测试类中要设置加载哪些Spring的配置(我这里是“/config/application*.xml”),然后就可以注入容器中的bean了。这里列举用注解的方式

复制代码
package com.nicchagil.mybatis3spring3intg.junit;

import java.util.List;

import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.nicchagil.mybatis3spring3intg.bean.User; import com.nicchagil.mybatis3spring3intg.service.UserService; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"/config/application*.xml"}) public class JunitTest { @Autowired private UserService userService; @Test public void c1() { List<User> userList = userService.query(new User()); System.out.println(userList); } }
复制代码

 在具体的测试类中,采用手动加载配置文件的方式进行JUnit测试,有如下缺点

1)导致多次Spring容器初始化问题

2)需要使用硬编码方式手工获取Bean ,需要强制转换

3)数据库现场容易遭受破坏(理想的状态:自动回滚对数据库的操作,保证数据库的现场不被破坏,因此重复测试不会发生问题)

4)不方便对数据操作正确性进行检查(理想状态:过jdbcTemplate在同一事务中访问数据库,查询数据的变化,验证操作的正确性)

 

> 常见的用法

常用的方式是将加载配置的部分公用出来:

复制代码
package com.nicchagil.mybatis3spring3intg.junit;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"/config/application*.xml"}) public class BaseJunit { }
复制代码

 

然后需要的各个测试类继承公用类:

package com.nicchagil.mybatis3spring3intg.junit;

import java.util.List;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.nicchagil.mybatis3spring3intg.bean.User;
import com.nicchagil.mybatis3spring3intg.service.UserService;

public class UserServiceTest extends BaseJunit {
    
    @Autowired
    private UserService userService;
  @Resource //自动注入,默认按名称  
  private IBaseDao baseDao;

  @Test
//标明是测试方法
  @Transactional //标明此方法需使用事务
  @Rollback(false) //标明使用完此方法后事务不回滚,true时为回滚
  public void c1() {
    List
<User> userList = userService.query(new User());
    System.out.println(userList);
  }
}

//复习:@Autowired & @Resource 的区别
//@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下: 
//    @Autowired  @Qualifier("personDaoBean") 
//    private PersonDao  personDao; 

//@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。 
//    @Resource(name=“personDaoBean”) 
//    private PersonDao  personDao;//用于字段上 

//注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 
 
   

 

 

 

转载于:https://www.cnblogs.com/swugogo/p/5908435.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值