使用MockMvc测试Spring Boot控制器时无法找到TranslatorService Bean
解决MockMvc测试时找不到TranslatorService的问题
核心原因
@WebMvcTest注解的设计目标是仅加载Web层相关的Bean(比如@RestController、@ControllerAdvice等),不会自动扫描并创建@Service、@Repository这类业务层/持久层的Bean实例。所以你的测试上下文里没有TranslatorService的Bean,导致控制器注入失败。
解决方法
方法1:使用@MockBean模拟TranslatorService(推荐)
测试控制器逻辑时,无需依赖真实的业务服务,用Mockito模拟服务行为即可:
修改测试类代码:
@WebMvcTest(TranslatorController.class) class TranslatorControllerTest { @Autowired private MockMvc mockMvc; // 模拟TranslatorService实例 @MockBean private TranslatorService translatorService; @Test public void testTranslateTextEndpoint() throws Exception { // 构造模拟返回结果 TranslatorOutput mockOutput = new TranslatorOutput("en", "es", "Hola", new Date()); // 指定调用translateText方法时返回模拟结果 when(translatorService.translateText(any(TranslatorInput.class))).thenReturn(mockOutput); TranslatorInput input = new TranslatorInput("Hello", "en", "es"); // 注意:控制器用的是@GetMapping,需统一请求方法(或把控制器改为@PostMapping) mockMvc.perform(MockMvcRequestBuilders.get("/translator") .contentType(MediaType.APPLICATION_JSON) .content(new ObjectMapper().writeValueAsString(input))) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.sourceLanguage").value("en")) .andExpect(MockMvcResultMatchers.jsonPath("$.targetLanguage").value("es")) .andExpect(MockMvcResultMatchers.jsonPath("$.translatedText").value("Hola")); } }
方法2:加载完整Spring上下文(适合集成测试,不推荐单测控制器)
如果必须使用真实的TranslatorService,可以改用@SpringBootTest配合@AutoConfigureMockMvc,这样会加载整个应用的Bean:
@SpringBootTest @AutoConfigureMockMvc class TranslatorControllerTest { @Autowired private MockMvc mockMvc; // 自动注入真实的TranslatorService(需确保AmazonTranslate的Bean能被正确创建) @Autowired private TranslatorService translatorService; @Test public void testTranslateTextEndpoint() throws Exception { // 测试逻辑... } }
这种方式会启动完整的Spring容器,测试速度较慢,且若TranslatorService依赖的AmazonTranslate需要AWS凭证等配置,还需额外处理测试环境的配置,因此不推荐用于控制器单测。
额外注意点
你的控制器方法标注的是@GetMapping,但测试代码中使用了MockMvcRequestBuilders.post,这会导致请求方法不匹配,返回405错误。需统一请求方式:要么将控制器方法改为@PostMapping("/translator"),要么测试中改用get请求。
内容的提问来源于stack exchange,提问作者rasilvap
相关产品推荐
相关产品推荐

