如何编写测试验证Java方法内各List是否按规则存入对应数量的消息
实现方案
你可以用Mockito参数捕获的方式来验证三个列表的元素数量,步骤如下:
- 第一步:引入测试依赖,常用组合为JUnit+Mockito,Spring Boot项目默认已经集成这两个框架,无需额外引入。
- 第二步:注意你贴的原代码存在笔误:第一个if分支里的
list.add(message)应该是list1.add(message),否则会编译报错,测试前先修复这个问题。 - 第三步:编写测试代码,核心逻辑是mock service对象,捕获
makeApiCall方法传入的Map参数,再校验Map中三个列表的长度即可。
测试代码示例(JUnit 5 + Mockito)
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.verify; // 这里换成你自己的类名 @ExtendWith(MockitoExtension.class) public class MessageProcessorTest { // mock掉依赖的service @Mock private Service service; // 这里Service换成你自己的service实际类名 // 把mock的service注入到要测试的类中 @InjectMocks private MessageProcessor messageProcessor; // 这里MessageProcessor换成你自己的包含process方法的类名 @Test public void testProcess_ListsCountMatchExpectation() { // 1. 构造测试入参:2条含123,3条含456,4条都不符合,总共9条 List<String> testMessages = List.of( "a123", "b123", "c456", "d456", "e456", "f", "g", "h", "i" ); // 2. 调用process方法 messageProcessor.process(testMessages); // 3. 捕获传给makeApiCall的Map参数 ArgumentCaptor<Map<String, List<String>>> mapCaptor = ArgumentCaptor.forClass(Map.class); verify(service).makeApiCall(mapCaptor.capture()); Map<String, List<String>> actualMap = mapCaptor.getValue(); // 4. 校验三个列表的数量是否符合预期 assertEquals(2, actualMap.get("123").size()); assertEquals(3, actualMap.get("345").size()); assertEquals(4, actualMap.get("678").size()); } }
如果你需要更细粒度的校验,也可以直接校验列表里的具体元素内容,只要把assertEquals的第二个参数换成你预期的列表即可。
内容的提问来源于stack exchange,提问作者JS noob
相关产品推荐
相关产品推荐

