1.基于AbstractDependencyInjectionSpringContextTests

  Spring的单元测试可以使用AbstractDependencyInjectionSpringContextTests做测试,不支持事务。AbstractTransactionalDataSourceSpringContextTests是支持事务的。

  Spring单元测试需要注意的地方:

  (1)需要注入的类内成员如果不是public类型,需要定义setter方法才能正常注入(针对在Spring配置中不重复的类,如果重复出现则需要使用getBean方法);

  (2)需要引入Spring-test.jar到工程,才能继承该测试类;

  (3)默认的classpath在WEB-INF/classes/目录下,如果Spring配置文件不在该目录下需要指定位置(设置classpath或者使用项目根目录);

  (4)如果测试类比较多,可以使用一个公共的测试基类完成注入的工作。

  (5) 需要一个getConfigLocations方法指定配置文件路径。

public class Test extends AbstractDependencyInjectionSpringContextTests {
@Autowired
private PersonService personService;
public PersonService getPersonService() {
return personService;
} protected String[] getConfigLocations() {
String[] configs = new String[] { "/Iocbean.xml"};
return configs;
} public void setPersonService(PersonService personService) {
this.personService = personService;
} public void test(){
personService.save();
}
}

 2.基于JUnit的测试

  单元测试目前主要的框架包括 Junit、TestNG,还有些 MOCK 框架,例如 Jmock、Easymock、PowerMock 等。 

public class AOPTestJunit {
private AService aService;
private ApplicationContext ctx; public AService getaService() {
return aService;
} public void setaService(AService aService) {
this.aService = aService;
} @Before
public void setUp() throws Exception {
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
} @After
public void tearDown() throws Exception {
} @Test
public void test() {
System.out.println("SpringTest JUnit test");
aService = (AService) ctx.getBean("aService");
aService.fooA("JUnit test fooA");
aService.barA();
} }

  3.基于注解的方式

  第2中方法的测试类中,我们还不能使用 Spring 的注解方式,会出现空指针异常,要实现注解方式的自动注入要使用如下的方式。 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-jms.xml")
@Transactional
public class ProducerConsumerTest { @Autowired
private ProducerService producerService;
@Autowired
@Qualifier("queueDestination")
private Destination destination; @Test
public void testSend() {
for (int i=0; i<2; i++) {
producerService.sendMessage(destination, "你好,生产者!这是消息:" + (i+1));
}
} } 

对标签的解释:

@RunWith 注释标签是 Junit 提供的,用来说明此测试类的运行者,这里用了 SpringJUnit4ClassRunner,这个类是一个针对 Junit 运行环境的自定义扩展,用来标准化在 Spring 环境中 Junit的测试用例,例如支持的注释标签。

@ContextConfiguration 注释标签是 Spring test context 提供的,用来指定 Spring 配置信息的来源,支持指定 XML 文件位置或者 Spring 配置类名,这里我们指定 classpath 下的 /spring-jms.xml 为配置文件的位置。

@Transactional 注释标签是表明此测试类的事务启用,这样所有的测试方案都会自动的 rollback,即不用自己清除自己所做的任何对数据库的变更了。

一些常见的基于 Junit4 的注释标签在 Spring 测试环境中的使用方法:

@Test(expected=...)

此注释标签的含义是,这是一个测试,期待一个异常的发生,期待的异常通过 xxx.class 标识。例如,我们修改 AccountService.Java 的 insertIfNotExist 方法,对于传入的参数如果为空,则抛出 IllegalArgumentException,如下:

public void insertIfNotExist(Account account) {

if(account==null)

throw new IllegalArgumentException("account is null");

Account acct = accountDao.getAccountById(account.getId());

if(acct==null) {

log.debug("No "+account+" found,would insert it.");

accountDao.saveAccount(account);

}

acct = null;

}

然后,在测试类中增加一个测试异常的方法,如下:

@Test(expected=IllegalArgumentException.class)

public void testInsertException() {

service.insertIfNotExist(null);

}

运行结果是 green bar。

@Test(timeout=...)

可以给测试方法指定超时时间(毫秒级别),当测试方法的执行时间超过此值,则失败。

比如在 AccountService 中增加如下方法:

public void doSomeHugeJob() {

try {

Thread.sleep(2*1000);

} catch (InterruptedException e) {

}

}

上述方法模拟任务执行时间 2 秒,则测试方法如下:

@Test(timeout=3000)

public void testHugeJob() {

service.doSomeHugeJob();

}

上述测试方法期待 service.doSomeHugeJob 方法能在 3 秒内结束,执行测试结果是 green bar。

@Repeat

通过 @Repeat,您可以轻松的多次执行测试用例,而不用自己写 for 循环,使用方法:

@Repeat(3)

@Test(expected=IllegalArgumentException.class)

public void testInsertException() {

service.insertIfNotExist(null);

}

这样,testInsertException 就能被执行 3 次。

Spring单元测试的更多相关文章

  1. SSM_CRUD新手练习(7)Spring单元测试分页请求

    好久没写这个系列博客了是因为本人去公司实习去了,公司用的是Spring+SpingMvc+Hibernate现在有时间了不管怎么样继续把这个项目写完. 因为机器的原因,我的环境变成了IDEA+orac ...

  2. SSM搭建Spring单元测试环境

    原文链接:https://jingyan.baidu.com/article/93f9803f5a97a4e0e46f55c8.html SSM搭建Spring单元测试环境

  3. 五、Spring ——单元测试

    1.JUnit4 JUnit测试用例的完整生命周期要经历一下阶段:类级初始化资源处理,方法级初始化资源处理.执行测试用例中的方法.方法级销毁资源处理.类级销毁资源处理. 测试方法 @Test 初始化 ...

  4. Spring错误——Spring 单元测试——Test class should have exactly one public constructor

    背景:Spring 构建单元测试 错误 java.lang.Exception: Test class should have exactly one public constructor at or ...

  5. Spring 单元测试 RequestContextHolder.getRequestAttributes()).getRequest(); 为空的原因

    原因是因为单元测试时没有加载 web.xml 中的: <!-- spring在service层获取session和request需要创建的监听器 --> <listener> ...

  6. spring单元测试报错:Failed to load ApplicationContext 的解决方法

    使用idea 配置单元测试之后,配置完spring的注解@junit 和@runer 之后 一直报错. 最后发现是默认使用jdk1.8引起的,使用jdk1.7即可.

  7. 当spring单元测试需要用到临时表的时候

    需要将整个单元测试的方法交给spring的事务管理器控制. 两种解决方法: 1.加载的spring配置文件中advice要切到需要测试的方法. 2.单元测试类继承AbstractTransaction ...

  8. Maven项目 Spring 单元测试

    使用maven创建web工程,将Spring配置文件applicationContext.xml放在src/resource下,用eclipse编译时提示class path resource [ap ...

  9. 整合Spring+Struts2+Mybatis加spring单元测试等

    前言 自己是在CentOS7的IntelliJ IDEA里开发的,里面中文输入法有问题经常用不了,所以这里用了很多chinglish,希望不要介意: 一:pom依赖 <?xml version= ...

随机推荐

  1. [51nod1291]Farmer

    用单调栈的话不严格的O(n^3)可以轻松艹过去,统计的时候要差分. 可以发现,对于一个单调栈里的元素,从它进栈到出栈都会重复类似的计算..再差分一波后就可以只在出栈的时候计算一下了. 具体的话看代码吧 ...

  2. BZOJ 3105: [cqoi2013]新Nim游戏

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意是要取一些数使得剩余的数xor和的子集不为0 拟阵.求解极大线性无关组.贪心从大到小 ...

  3. DFS(dfs)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2212 DFS Time Limit: 5000/2000 MS (Java/Others)    Me ...

  4. 在R12下加载Java Bean,配置FORMS_WEB_CONFIG_FILE文件/通过AutoConfig实现Form Server配置文件的修改

    1.定位模版文件$AD_TOP/bin/adtmplreport.sh contextfile=$CONTEXT_FILE target=$FORMS_WEB_CONFIG_FILE以上命令,通过查看 ...

  5. android文件管理器源码、斗鱼直播源码、企业级erp源码等

    Android精选源码 文件清理管理器 自定义水平带数字的进度条以及自定义圆形带数字的进度条 利用sectionedRecyclerViewAdapter实现分组列表的recyclerView源码 流 ...

  6. Centos7网络配置-转载

    一. 查看网络地址: centos7取消了ifconfig命令,使用ip addr命令查看IP地址 二.配置网络 用VirtualBox安装的CentOS7,安装完成后,发现无法上网,于是到网上查了一 ...

  7. 访问网站出现 Directory Listing Denied This Virtual Directory 

    出现这个提示是指没有在您指定的目录找到默认首页,比如您直接输入域名访问空间, 但是出现以上提示,那么请检查目录下是否有 index.htm,index.html,index.asp,default.a ...

  8. Angular CLI: 发布到 GitHub Pages

    发布 Angular 应用的简单方式是使用 GitHub Pages. 首先需要创建一个 GitHub 账号,随后,为您的项目创建一个仓库.记下 GitHub 中的用户名和项目名称. 例如,我的 Gi ...

  9. 实现LNMP

    实现LNMP 环境: linux系统机器 A:一台N:nginx,ip:192.168.213.251 B:一台P:php-fpm,php-mysql ,ip:192.168.213.253 C:一台 ...

  10. Python-Blog2-编写Web app 骨架

    撸代码之前让我们先来看几个概念: 什么是协程(Coroutine)? 假设现在有两个子程序,子程序A和子程序B: def A(): print('1') print('2') print('3') d ...