技术开发 频道

Spring单元测试

【IT168 技术文章】

    本文简单地描述一下基于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); } }
0
相关文章