java void方法单测断言的三种实现示例

 更新时间:2025年07月09日 10:45:28   作者:悟能不能悟  
Java中对void方法单元测试可通过验证状态变化、行为交互及异常抛出实现,推荐使用AssertJ和Mockito,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

在 Java 中对 void 方法进行单元测试断言,主要通过以下三种策略实现(以 JUnit 和 AssertJ 为例):

1. 验证状态变化(最常用)

测试方法执行后对象或系统状态的改变:

@Test
void reset_shouldClearCounter() {
    Counter counter = new Counter();
    counter.increment(); // 初始值+1
    
    // 执行 void 方法
    counter.reset();
    
    // 验证内部状态
    assertEquals(0, counter.getCount());
    
    // 使用 AssertJ 更优雅的断言
    assertThat(counter.getCount()).isZero();
}

2. 验证行为交互(使用 Mockito)

当 void 方法依赖其他对象时,验证是否正确调用协作对象:

@Test
void notifyUser_shouldTriggerNotificationService() {
    // 创建依赖项的 mock
    NotificationService mockService = mock(NotificationService.class);
    UserService userService = new UserService(mockService);
    
    // 执行 void 方法
    userService.notifyUser("user123");
    
    // 验证是否调用了依赖对象的特定方法
    verify(mockService).sendNotification(eq("user123"));
    
    // 验证调用次数
    verify(mockService, times(1)).sendNotification(any());
}

3. 验证异常抛出

测试方法在非法输入时的异常行为:

@Test
void withdraw_shouldThrowExceptionWhenOverdraft() {
    Account account = new Account(100);
    
    // 验证异常断言 (JUnit 5)
    assertThrows(InsufficientFundsException.class, () -> {
        account.withdraw(200); // void 方法
    });
    
    // AssertJ 异常断言
    assertThatThrownBy(() -> account.withdraw(200))
        .isInstanceOf(InsufficientFundsException.class)
        .hasMessage("余额不足");
}

最佳实践建议:

状态优先原则​:优先验证对象状态变化而非内部行为

行为验证场景​:

  • 当调用外部系统接口(如发送邮件)
  • 需要确认调用顺序或次数(如多次调用)

自定义验证器​:复杂状态可封装验证逻辑

@Test
void updateProfile_shouldChangeMultipleFields() {
    User user = new User();
    user.updateProfile("Alice", 30, "alice@email.com");
    
    // 自定义断言方法
    assertUserProfile(user, "Alice", 30, "alice@email.com");
}
 
private void assertUserProfile(User user, String name, int age, String email) {
    assertThat(user.getName()).isEqualTo(name);
    assertThat(user.getAge()).isEqualTo(age);
    assertThat(user.getEmail()).isEqualTo(email);
}

完整测试示例:

public class ShoppingCartTest {
    @Test
    void clear_shouldRemoveAllItems() {
        // 准备
        ShoppingCart cart = new ShoppingCart();
        cart.addItem(new Item("Book", 15.99));
        cart.addItem(new Item("Pen", 1.99));
        
        // 执行
        cart.clear();
        
        // 验证
        assertThat(cart.isEmpty())
            .as("购物车应在清空后为空")
            .isTrue();
    }
 
    @Test
    void processOrder_shouldPersistToDatabase() {
        // 准备
        OrderDao mockDao = mock(OrderDao.class);
        OrderService service = new OrderService(mockDao);
        Order order = new Order("ORDER-123");
        
        // 执行
        service.processOrder(order);
        
        // 验证数据库交互
        verify(mockDao).save(order);
    }
 
    @Test
    void setDiscount_shouldThrowForInvalidValue() {
        Product product = new Product();
        
        assertThatThrownBy(() -> product.setDiscount(-10))
            .isInstanceOf(IllegalArgumentException.class)
            .hasMessageContaining("折扣值非法");
    }
}

关键结论​:

  1. Void 方法通过间接验证状态变化或检查方法行为进行断言
  2. 优先使用 assertEquals/assertThat 检查状态变化
  3. 对依赖交互使用 Mockito 的 verify
  4. 异常场景用 assertThrows/assertThatThrownBy
  5. 复杂断言使用自定义断言方法保持可读性

对于现代 Java 测试,推荐使用 ​AssertJ​ 提供的丰富断言(如 assertThat().isEmpty())和 ​Mockito​ 进行行为验证,比传统的 JUnit 断言更具表达力。

到此这篇关于java void方法单测断言的三种实现示例的文章就介绍到这了,更多相关java void断言内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Map集合中get不存在的key值,会抛出异常吗?

    浅谈Map集合中get不存在的key值,会抛出异常吗?

    这篇文章主要介绍了浅谈Map集合中get不存在的key值,会抛出异常吗?具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 使用stream流多字段排序SpringBoot

    使用stream流多字段排序SpringBoot

    文章介绍了在Java8中使用stream流对对象的多个字段进行排序的方法,首先准备数据,然后演示了单个字段和多个字段的排序操作,包括升序和降序,文章最后总结了单个字段排序和多个字段排序的区别,并鼓励读者参考和分享
    2025-11-11
  • Java详细讲解包的作用以及修饰符的介绍

    Java详细讲解包的作用以及修饰符的介绍

    本文主要讲述的是包的使用和注意事项和四种访问修饰符public,protected,默认的,private的访问范围及实例,感兴趣的朋友一起来看看
    2022-05-05
  • 详解使用Spring Boot开发Web项目

    详解使用Spring Boot开发Web项目

    这篇文章主要介绍了详解使用Spring Boot开发Web项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Java调用接口如何获取json数据解析后保存到数据库

    Java调用接口如何获取json数据解析后保存到数据库

    这篇文章主要介绍了Java调用接口如何获取json数据解析后保存到数据库问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • springboot远程debug调试全过程

    springboot远程debug调试全过程

    这篇文章主要介绍了springboot远程debug调试全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • spring boot集成pagehelper(两种方式)

    spring boot集成pagehelper(两种方式)

    这篇文章主要介绍了spring boot集成pagehelper(两种方式),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 以Java代码的方式总结几个典型的内存溢出案例

    以Java代码的方式总结几个典型的内存溢出案例

    作为程序员,多多少少都会遇到一些内存溢出的场景,如果你还没遇到,说明你工作的年限可能比较短,或者你根本就是个假程序员!哈哈,开个玩笑.今天分享给大家Java内存溢出的相关案例,希望大家在日常工作中,尽量避免写这些low水平的代码,需要的朋友可以参考下
    2021-06-06
  • SpringBoot整合Java DL4J实现情感分析系统

    SpringBoot整合Java DL4J实现情感分析系统

    在当今数字化时代,企业越来越重视用户的反馈,以不断改进产品和服务,自然语言处理技术为分析用户评价提供了强大的工具,本文将介绍如何使用 Spring Boot 整合 Java Deeplearning4j 构建一个情感分析系统,需要的朋友可以参考下
    2024-10-10
  • java.lang.Runtime.exec的左膀右臂:流输入和流读取详解

    java.lang.Runtime.exec的左膀右臂:流输入和流读取详解

    这篇文章主要介绍了java.lang.Runtime.exec的左膀右臂:流输入和流读取详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论