1. 不使用 Spring Test + Junit 集成时, 对 Spring Web项目进行单元测试
1.1 代码如下
public class UserServiceTest { private ApplicationContext ctx = null; @Before public void setUp() { ctx = new ClassPathXmlApplicationContext("classpath*:applicationContext.xml"); } @Test public void addUser() { User user = new User(); user.setNickname("test-nickname"); user.setPassword("test-password"); UserService userService = (UserService) ctx.getBean("userService"); Assert.assertNotNull(userService); } }1.2 缺点:
1). 繁琐. 需要手动获取ApplicationContext; 无法使用 @Resource 或 @AutoWired 注入依赖对象
2). 无法实现事务
2. 使用 Spring Test + Junit 来完成单元测试
2.1 Maven项目导入依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.3.9.RELEAS</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </version> </dependency>2.2. 建立抽象的测试基类, 供其他测试类继承使用以快速编写Junit测试用例, 而不需要每次都进行配置, 代码如下
/** * * RunWith 注解 * * 1. RunWith 是 JUnit的一个常用注解, 用于指定 测试运行器 * 要弄清楚什么是 测试运行器, 首先要明白几个概念: 测试方法, 测试类, 测试集, 测试运行器 * 其中 测试方法是使用 @Test注解的一些方法 * 测试类是包含一个或多个测试方法的 **Test.java文件 * 测试集是一个 suite, 可能包含多个测试类 * 测试运行器则决定了用什么方式偏好去运行这些测试集/类/方法 * 2. 常见的运行器有 * 1) @RunWith(Parameterized.class) 参数化运行器, 配合 @Parameters使用 Junit的参数化功能 * 2) @RunWith(Suite.class) * + @SuiteClasses(ATest.class, BTest.lass, CTest.class) 测试集运行器配合使用测试集功能 * 3) @RunWith(Junit4.class) Junit4的默认运行器 * 4) @RunWith(Junit38ClassRunner.class) 用于兼容 Junit3.8的运行器 * 5) 一些其他运行器具备更多功能, 例如 @RunWith(SpringJunit4ClassRunner.class) 继集成 Spring的一些功能 * * * * ContextConfiguration 注解 * 用于加载配置文件 * locations (default value) 属性用于加载配置文件, 多个配置文件之间用逗号隔开 * classes 属性用于加载配置类, 多个配置类之间用逗号隔开 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath*:applicationContext.xml"}) public abstract class BaseServiceTest { }
public class ProductServiceTest extends BaseServiceTest { @Resource(name = "productService") private IProductService productService; @Test public void testAddProduct() { Product product = new Product(); product.setName("测试商品-1"); product.setPrice(50); product.setCost(30); product.setImageUrl("https://--"); product.setFactory("商品制造商-1"); product.setCreateTime(new Date()); product.setValid("Y"); int res = productService.addProduct(product); System.out.println(res); } }