Junit单元测试Spring框架接口

时间:2023-01-08 12:56:14

Web项目整合Spring后,所有的接口,类都可以加载到ApplicationContext中。项目不用启动也可以加载到内存中,并通过applicationContext获取。

使用main方法测试,如下:

package testCase;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.xy.domain.CategoryDTO;
import com.xy.service.ProductIndexService;

public class MyTest {
public static ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml");
public static void main(String[] args) throws Exception{
ProductIndexService productIndexService = (ProductIndexService)applicationContext.getBean("productIndexService");
CategoryDTO categoryDTO = new CategoryDTO();
categoryDTO.setCategoryName("测试类目");
categoryDTO.setCategoryLevel(1);
categoryDTO.setCategoryDesc("main方法测试类目");
productIndexService.insertCategory(categoryDTO);
}
}
Junit单元测试Spring框架接口

使用main方法有以下的不足:

1.不能使用@AutoWire自动注入获取service,只能通过getBean()方式获取。

2.调用增、删、改以后,数据都会留在表里,只能手动删除表中数据。一般来说测试不需要表里保留数据。

3.如果要测试的类里面有多个方法,用main方法测试就很不方便。

使用Junit测试以后就可以解决以上的问题。

准备:

需要下载junit的jar包,引入项目内。(Junit4.8).

引入spring相关jar包(Spring-test)。

测试基类:

spring中提供了两种支持Junit的父类。

AbstractTransactionalJUnit4SpringContextTests//需要spring配置事务
AbstractJUnit4SpringContextTests//不需要事务
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean>
在测试类中需要加入@RunWith和@ContextConfiguration来自动加载Spring上下文信息。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:application-context.xml")
编写测试基类:

package base;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
* Junit测试基类
* 继承AbstractJUnit4SpringContextTests
* @author javaw
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:application-context.xml")
public class BaseTestCase extends AbstractJUnit4SpringContextTests{

}

package base;

import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
* Junit测试基类
* 继承AbstractTransactionalJUnit4SpringContextTests
* 可实现事务回滚
* @author javaw
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:application-context.xml")
public abstract class BaseTransactionTestCase extends AbstractTransactionalJUnit4SpringContextTests{

}

测试类:

可以使用@Autowired或者@Resource将serivce层注入。

package testCase;


import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import base.BaseTransactionTestCase;

import com.xy.domain.CategoryDTO;
import com.xy.service.ProductIndexService;

public class ProductIndexTestCase extends BaseTransactionTestCase{
@Autowired
public ProductIndexService productIndexService;

@Before
public void setUp() throws Exception {

}

@Test
public void testInsertCategory() throws Exception{
CategoryDTO categoryDTO = new CategoryDTO();
categoryDTO.setCategoryName("测试类目");
categoryDTO.setCategoryLevel(1);
categoryDTO.setCategoryDesc("Junit测试类目");
int i = productIndexService.insertCategory(categoryDTO);
Assert.assertEquals(1, i);
}
}
Junit单元测试Spring框架接口

测试类分别继承BaseTestCase和BaseTransactionTestCase,分别执行了insert方法以后,继承BaseTestCase时,数据库中增加了一条数据。

继承BaseTranscationTestCase时,数据库中并没有插入数据。可见事务已经自动回退掉了。