Spring Boot中测试ValService时如何Mock AppService的sendToAPI方法?
如何Mock外部依赖测试ValService
要测试ValService的validate方法,核心是把依赖的AppServiceMock掉,避免调用真实的外部API。下面用Java常用的Mockito框架来实现:
步骤1:确保测试依赖到位
在项目的测试依赖中加入Mockito相关包(比如mockito-core和适配JUnit 5的mockito-junit-jupiter)。
步骤2:搭建测试类结构
用Mockito的注解快速配置Mock对象和测试目标类:
@Mock:创建AppService的Mock实例,替代真实的服务实现@InjectMocks:自动把Mock的AppService注入到ValService实例中,避免手动写注入逻辑
步骤3:编写测试用例
以测试正常场景为例,代码如下:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; 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) class ValServiceTest { @Mock private AppService appService; @InjectMocks private ValService valService; @Test void validate_shouldProcessMockedCharCorrectly() { // 准备测试参数 List<String> testStrList = List.of("foo", "bar"); String testId = "test-001"; Character mockReturnChar = 'X'; // 指定Mock方法的行为:当调用sendToAPI传入对应参数时,返回预设字符 when(appService.sendToAPI(testStrList, testId)).thenReturn(mockReturnChar); // 调用要测试的validate方法 String validateResult = valService.validate(testStrList, testId); // 断言结果符合预期(这里假设validate方法会返回包含该字符的验证结果) assertEquals("Validation passed: X", validateResult); // 可选验证:确认sendToAPI确实被调用了一次,参数正确 verify(appService, times(1)).sendToAPI(testStrList, testId); } }
额外场景处理
- 模拟异常:如果需要测试
sendToAPI抛出异常时ValService的处理逻辑,可以用when(appService.sendToAPI(anyList(), anyString())).thenThrow(new RuntimeException("API error")); - 宽松参数匹配:如果不需要严格匹配参数,可用
anyList()、anyString()等匹配器,比如when(appService.sendToAPI(anyList(), anyString())).thenReturn('Y'); - 依赖注入要求:确保
ValService中的AppService是通过构造器注入、Setter注入等方式引入的,这样Mockito才能顺利替换为Mock对象,避免硬编码实例化。
内容的提问来源于stack exchange,提问作者titania
相关产品推荐
相关产品推荐

