单元测试框架TestNG、Mockito、Unitils-Spring及示例

本文介绍了如何使用TestNG进行脚本方式运行测试,结合Mockito进行模拟对象测试,以及如何利用Unitils进行反射断言和整合Spring的配置。特别提醒,使用Unitils整合Spring时,需要注意模块启动顺序,避免数据库数据源导致测试失败。通过自定义unitils.property文件可以调整启动配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. TestNG  对Junit的扩展可通过xml脚本同时运行多个case
TestNG运行时将经过一下几个阶段:
1. 类级初始化资源处理        @BeforeClass注解标记
2. 方法级别初始化资源处理    @BeforeMethod
3. 执行测试用例中的方法      @Test
4. 方法级别的销毁          @AfterMethod
5. 类级别的销毁           @AfterClass
如果定义了多个初始化方法,先执行定义在最后面的,而销毁方法先执行定义在最前面的。
如果定义多个@Test的用例,会为每个@Test方法生成一个测试用例实例分别运行。
@BeforeClas @AfterClass在一个测试用例实例中只运行一次。

测试方法: 通过@Test标注方法执行一个测试逻辑,然后通过Assert进行断言。
详细实例请见:com.test.TestNGLearn

二. Mockito
Mockito只适用于对Service层的方法进行单元测试
Mockito可以mock某些类和方法的执行,设定某些期望的行为和返回值
常用来测试判定逻辑等,通过mock避免执行某些依赖的逻辑

Mockito + Assert 可以方便的测试服务类的逻辑结构。

详细实例请见:com.test.MockitoLearn

三. Unitils
专用于测试框架整合, 通过配置文件开启模块功能。unitils定义了Module接口,通过实现这个接口整合其他框架,同时也可以自定义。
1. ReflectionAssert反射断言 详细实例见: com.test.UnitilsLearn
2. 集成Spring               详细实例见:com.test.UnitilsSpring
3. 集成Hibernate
4. 集成DBUtil
5. 对web层测试

TestNG示例:

package com.test;


import org.testng.annotations.*;

// 用于指定类属于的分组
// @Test(groups = {"group1"})
public class TestNGLearn {

    @BeforeClass
    public static void init(){
        System.out.println("类初始化");
    }

    @AfterClass
    public static void destroy(){
        System.out.println("类销毁");
    }

    @BeforeMethod
    public void initMethod(){
        System.out.println("用例执行初始化");
    }

    @Test
    public void testTestNG(){
        System.out.println("一个简单的测试");
    }

    // 开启异常测试,如果没有抛出指定的异常则测试失败。
    @Test(enabled = true , expectedExceptions = RuntimeException.class)
    public void testException(){
        throw new RuntimeException();
    }

    // 如果在timeOut指定的毫秒时间内未完成则测试失败
    @Test(enabled = true, timeOut = 2000)
    public void testTimeOut() throws InterruptedException{
        Thread.sleep(2000);
    }

    // 参数化测试,直接提供批量的测试参数,不必为每个参数写测试用例
    @DataProvider(name = "testParam")
    public static Object[][] getParameters(){
        String [][] params = {
  
  {"第一组第一个参数","第一组第二个参数"},{"第二组第一个参数","第二组第二个参数"}};
        return params;
    }
    // 通过一个二维数组,指定多组参数,每组可指定多个参数。
    @Test(dataProvider = "testParam")
    public void testBatchParam(String first , String second){
           System.out.println(first + " " +second);
    }

    // 分组测试, 每个测试方法单独生成实例,并都执行@BeforeMethod,而@BeforeClass之执行一次
    @Test(groups = {"group1"})
    public void testGroup2(){
        System.out.println("分组测试 group1分组的第1个测试用例");
    }

    @Test(groups = {"group1","group2"})
    public void testGroup1_1(){
        System.out.println("分组测试 group2分组的第1个测试用例");
    }

    @Test(groups = {"group2"})
    public void testGroup1_2(){
        System.out.println("分组测试 group2分组的第2个测试用例");
    }


    // 依赖测试
    @Test
    public void testDepond(){
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值