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);
}
}