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

如何对接口中调用抽象方法的默认方法convertList编写单元测试

为MyConverter的convertList方法编写单元测试方案

我来帮你搞定这个单元测试的问题!针对你提到的MyConverter接口里的convertList默认方法,我们可以用Mockito配合JUnit来完成你需要的两个验证点,具体实现如下:

测试前提说明

首先回顾下你的接口定义:

public interface MyConverter {
ConverterOutput convert(final MyDTO input, final String myParam);

default List<ConverterOutput> convertList(final List<MyDTO> inputList, final String myParam) {
    // 默认实现:遍历inputList,调用convert方法收集结果
    return inputList.stream()
        .map(input -> convert(input, myParam))
        .collect(Collectors.toList());
}

}

测试目标

我们需要验证两个核心点:

  • convert方法的调用次数与inputList的大小完全一致
  • 每个输入元素对应的ConverterOutput都被正确加入到转换结果列表中

具体测试代码实现

我们可以借助Mockito来mockMyConverter接口实例,通过打桩和验证来完成测试:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.*;

@ExtendWith(MockitoExtension.class)
public class MyConverterTest {

    @Mock
    private MyConverter myConverter;

    @Test
    void convertList_ShouldCallConvertForEachElementAndReturnCorrectResults() {
        // 1. 准备测试数据
        MyDTO dto1 = new MyDTO(); // 假设你已经有MyDTO的实例化方式
        MyDTO dto2 = new MyDTO();
        MyDTO dto3 = new MyDTO();
        List<MyDTO> inputList = List.of(dto1, dto2, dto3);
        String testParam = "test-param";

        ConverterOutput output1 = new ConverterOutput(); // 对应dto1的预期输出
        ConverterOutput output2 = new ConverterOutput(); // 对应dto2的预期输出
        ConverterOutput output3 = new ConverterOutput(); // 对应dto3的预期输出

        // 2. 为convert方法打桩:指定每个输入对应的返回值
        when(myConverter.convert(dto1, testParam)).thenReturn(output1);
        when(myConverter.convert(dto2, testParam)).thenReturn(output2);
        when(myConverter.convert(dto3, testParam)).thenReturn(output3);

        // 3. 调用待测试的convertList方法
        List<ConverterOutput> result = myConverter.convertList(inputList, testParam);

        // 4. 验证第一点:convert方法的调用次数等于inputList的大小
        verify(myConverter, times(inputList.size())).convert(any(MyDTO.class), eq(testParam));
        // 如果你想更精准验证每个具体参数的调用,可以分别验证:
        // verify(myConverter).convert(dto1, testParam);
        // verify(myConverter).convert(dto2, testParam);
        // verify(myConverter).convert(dto3, testParam);

        // 5. 验证第二点:结果列表与预期输出完全一致
        List<ConverterOutput> expectedOutput = List.of(output1, output2, output3);
        assertEquals(expectedOutput, result);
    }
}

代码解释

  • Mock接口实例:用@Mock注解创建MyConverter的mock实例,这样我们可以控制convert方法的返回值,同时验证它的调用情况
  • 打桩设置:通过when(...).thenReturn(...)指定每个MyDTO输入对应的ConverterOutput返回值,确保convertList的结果可预测
  • 调用次数验证:用verify(myConverter, times(inputList.size()))来确认convert方法被调用的次数和输入列表的元素数量一致,也可以用精准的参数匹配来验证每个元素都被处理了
  • 结果验证:通过断言结果列表和预期列表相等,确保每个转换后的输出都被正确收集到结果中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:50:28