Spring Web项目集成 Junit

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项目导入依赖

     org.springframework
     spring-test
     4.3.9.RELEAS


     junit
     junit
     4.12

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





你可能感兴趣的:(Junit)