java

位置:IT落伍者 >> java >> 浏览文章

Spring应用的单元测试


发布日期:2024年03月10日
 
Spring应用的单元测试
单元测试现在越来越被广泛重视起来而Spring更是将时下比较流行的Junit开元测试框架进行整合下面我简单的介绍一下在Sping中该如何对代码进行单元测试(本节会认为读者已经具备了Junit基础方面的知识)按照Spring的推荐在单元测试时不应该依赖于Spring容器也就是说不应该在单元测试是启动ApplicationContext并从中获取Bean相反应该通过模拟对象完成单元测试而Spring就提供了这样一个类供大家继承下面来看看示例代码

)自动装配的测试用例

代码清单

import orgspringframeworkbeansfactoryannotationAutowired;

import orgspringframeworkstereotypeService;

import comtonywebdaoFooDao;

@Service

public class FooService {

@Autowired

private FooDao dao;

public String save(String name){

if(name == null || equals(name))

throw new RuntimeException(Name is null

return daosave(name)

}

}

import orgspringframeworkstereotypeRepository;

@Repository

public class FooDao {

public String save(String name){

return success;

}

}

import orgspringframeworktest

AbstractDependencyInjectionSpringContextTests;

import comtonywebserviceFooService;

public class MyTest extends AbstractDependencyInjectionSpringContextTests{

protected FooService fooService;

//set方法

public void setFooService(FooService fooService) {

thisfooService = fooService;

}

//指定Spring配置文件的位置

protected String[] getConfigLocations(){

return new String[]{springconfigbeansxml};

}

//测试方法

public void testSave(){

String str = thisfooServicesave(Tony

Systemoutprint(str)

assertEquals(success str)

}

}

<?xml version= encoding=UTF?>

<beans xmlns=//…>

<context:componentscan basepackage=comtony/>

</beans>

代码清单中定义了FooServicejava和FooDaojava两个Bean已经使用 @Autowired进行了装配我们的单元测试类MyTest继承了

AbstractDependencyInjectionSpringContextTests类配置好fooService的set方法并且指定Spring配置文件的位置后当测试用例运行时我们需要的fooService会自动注入进来我们只要在testSave方法中直接使用就可以了还有两外一种写法

代码清单

public class MyTest extends AbstractDependencyInjectionSpringContextTests{

protected FooService fooService;

public MyTest(){

//启用直接对属性变量进行注入的机制

thissetPopulateProtectedVariables(true)

}

protected String[] getConfigLocations(){

return new String[]{springconfigbeansxml};

}

public void testSave(){

String str = thisfooServicesave(Tony

Systemoutprint(str)

assertEquals(success str)

}

}

代码清单中我们移除了set方法增加了一个构造函数在构造函数中调用父类的方法启用直接对属性变量进行注入的机制有时我们测试的时候会操作数据库插入一条记录由于我们不会每次都修改测试的数据当我们再次插入同样的数据时数据库肯定会要报错了此时我们需要既能测试又能不让测试的数据在数据库中起作用Spring就知道我们的这个需要为我们准备了AbstractTransactionalSpringContextTests这个类

代码清单

import orgspringframeworktest

AbstractTransactionalSpringContextTests;

import comtonywebserviceFooService;

public class MyTest extends AbstractTransactionalSpringContextTests{

protected FooService fooService;

public MyTest(){

thissetPopulateProtectedVariables(true)

}

protected String[] getConfigLocations(){

return new String[]{springconfigbeansxml};

}

//测试方法中的数据操作将在方法返回前被回滚不会对数据库产生永久性数据操作下一//次运行该测试方法时依旧可以成功运行

public void testSave(){

String str = thisfooServicesave(Tony

Systemoutprint(str)

assertEquals(success str)

}

}

这样就可以在方法返回之前将测试数据回滚以保证下次单元测试的成功               

上一篇:eclipse打jar包注意事项

下一篇:Jakarta Struts简介(一)