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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:47:31