本文简单的描述一下基于spring系统service层的单元测试 。
Spring本身即是一个容器,所有的业务对象都是通过spring容器来管理,spring的注入特点让我们轻松的解除了类与类之间的耦合性。但是也给我们写单元测试带来了不少的麻烦,不过这种情况是在没有考虑spring提供的单元测试工具的情况下才会发生的事情。
1 准备需要的jar包。
spring-mock.jar 和 naming-factory-dbcp.jar。第一个jar包中包括了spring提供的单元测试工具类,第二个jar包是提供建立jdbc连接所需要的类。
2 继承 AbstractTransactionalDataSourceSpringContextTests。
Spring提供了几种基于junit的单元测试工具类,这里只介绍AbstractTransactionalDataSourceSpringContextTests,其他的请看官方文档。这是一个具有事务的单元测试用例,你可以设置单元测试成功后数据库事务是提交还是回滚,默认为回滚。
在继承类中需要实现getConfigLocations方法,这个方法主要是为了取得spring的application-context.xml文件。
protected String[] getConfigLocations() {
String[] config = new String[] {
"xxx-applicationContext.xml", "xxxx-applicationContext.xml"
};
return config;
}
注意,一:如果才用上面的写法,这些xml文件必须在classpath下;二:TransactionManager只能定义一个。
3 写自己的测试用例吧。。;-)
示例代码:
public abstract class MyDependencyInjectionSpringContextTests
extends AbstractTransactionalDataSourceSpringContextTests {
protected ServiceContext context;
public MyDependencyInjectionSpringContextTests() {
}
/**
* 重写父类的onSetUpBeforeTransaction方法.
*
*/
protected void onSetUpBeforeTransaction() throws Exception {
super.onSetUpBeforeTransaction();
//此处可以加入你想进行的统一操作
。。。。。
//调用子类的处理
beforeSetUp();
}
protected abstract void beforeSetUp() throws Exception;
protected String[] getConfigLocations() {
String[] config = new String[] {
"service-applicationContext.xml", "dao-applicationContext.xml"
};
return config;
}
}
====================================================================
public class MockServiceTest
extends MyDependencyInjectionSpringContextTests {
Mock mock;
MockService service;
protected void beforeSetUp() throws Exception {
//初始化测试需要使用的数据
mock=new Mock();
mock.setName("test");
mock.setType(1);
service=(MockService) applicationContext.getBean(
"mockService");
}
public void testAddMock() {
//测试方法
service.addMock(mock);
//这里使用的是是hibernate,增加后主键被填充,所以只要判断实体对象的id是否为null即可
Assert.assertTrue("测试addMock方法失败。" mock.getMockId!=null);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(MockServiceTest.class);
}
}