You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对依赖其他方法的方法进行单元测试?如何测试属性文件缺失指定配置的场景?

咱们一个个来解决这两个单元测试的问题,都是日常开发里很常见的场景👇

问题1:如何对依赖其他方法的方法开展单元测试?

核心思路就是把被测方法的依赖彻底隔离——单元测试要聚焦当前方法的业务逻辑,而不是它调用的其他方法/组件的实现。这里给你几个实用的落地方法:

  • 用Mock框架(比如Mockito)模拟依赖方法
    如果依赖的是同一个类里的其他方法,你可以用@Spy做部分模拟,指定依赖方法的返回值;如果依赖的是其他类的方法,直接用@Mock模拟整个依赖类,再注入到被测类中。
    举个实际的代码例子:

    // 被测类
    public class OrderService {
        public double calculateTotal(int itemId, int quantity) {
            double price = getItemPrice(itemId); // 依赖的方法
            return price * quantity;
        }
    
        public double getItemPrice(int itemId) {
            // 实际可能调用DB或者外部服务
            return 10.0;
        }
    }
    

    测试时模拟getItemPrice()的返回,只验证calculateTotal()的逻辑:

    @Spy
    private OrderService orderService;
    
    @Test
    public void testCalculateTotal() {
        // 指定当调用getItemPrice(1)时返回20.0
        doReturn(20.0).when(orderService).getItemPrice(1);
        double total = orderService.calculateTotal(1, 2);
        assertEquals(40.0, total, 0.001);
    }
    
  • 把依赖抽象成接口,注入测试用Stub
    如果依赖的是外部组件(比如配置读取、DB操作),先把它抽象成接口,测试时传入一个自己写的Stub实现(比如返回固定值、模拟异常),彻底和真实环境隔离。

  • 不要忽略异常/边界场景
    除了依赖方法正常返回的情况,还要模拟它抛出异常、返回null/空值的场景,确保被测方法能正确处理这些情况——这才是单元测试的价值所在。

问题2:针对属性文件中不存在ConfigProperties.MY_INVENTORY_FILE的条件进行单元测试

这个场景的关键是模拟配置属性缺失的运行环境,具体做法看你用的配置框架,这里以Spring Boot为例(最常见的场景):

  • 用@TestPropertySource模拟属性缺失
    如果是Spring Boot项目,你可以在测试类里不指定这个属性,直接模拟配置文件里没有它的情况:

    @SpringBootTest
    // 不设置MY_INVENTORY_FILE,模拟属性不存在
    @TestPropertySource(properties = {})
    public class InventoryServiceTest {
    
        @Autowired
        private InventoryService inventoryService;
    
        @Test
        public void testWhenInventoryFilePropertyMissing() {
            // 验证方法在属性缺失时的行为,比如抛出配置异常、使用默认值等
            assertThrows(ConfigurationException.class, () -> inventoryService.loadInventory());
        }
    }
    
  • 直接MockConfigProperties类(无需启动Spring上下文)
    如果想快速测试,不用启动整个Spring容器,直接用Mockito模拟ConfigProperties实例,让它的对应方法返回null(模拟属性不存在):

    @Mock
    private ConfigProperties configProperties;
    
    @InjectMocks
    private InventoryService inventoryService;
    
    @Test
    public void testWhenInventoryFilePropertyMissing() {
        // 模拟属性不存在时的返回值
        when(configProperties.getMyInventoryFile()).thenReturn(null);
        // 验证方法的预期行为
        boolean isAvailable = inventoryService.isInventoryFileAvailable();
        assertFalse(isAvailable);
    }
    
  • 重点覆盖属性缺失的代码分支
    测试前先理清楚:当这个属性不存在时,你的方法会走哪条逻辑?是用默认文件路径?还是抛出异常?还是跳过某些操作?一定要把这些分支都覆盖到,确保逻辑符合预期。


内容的提问来源于stack exchange,提问作者user373201

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:56:48