如何对接口中调用抽象方法的默认方法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
相关产品推荐
相关产品推荐

