如何对依赖其他方法的方法进行单元测试?如何测试属性文件缺失指定配置的场景?
咱们一个个来解决这两个单元测试的问题,都是日常开发里很常见的场景👇
核心思路就是把被测方法的依赖彻底隔离——单元测试要聚焦当前方法的业务逻辑,而不是它调用的其他方法/组件的实现。这里给你几个实用的落地方法:
用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/空值的场景,确保被测方法能正确处理这些情况——这才是单元测试的价值所在。
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()); } }直接Mock
ConfigProperties类(无需启动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

