MockMvc发起Get请求无法访问Controller返回404问题排查求助
问题根因
404的核心原因是测试类的配置错误,导致Spring测试上下文没有注册DepartmentController的接口映射:
- 你加了
@ContextConfiguration(classes = com.bnpp.leavemanagementsystem.LeaveManagementSystemApplicationTests.class),指定的配置类是测试类本身,既不是标准Spring配置类,也不会扫描你业务代码所在的com.bnpp.leavemanagement包,导致Controller根本没有被加载到测试上下文中。 - 测试类里的大量冗余注解干扰了
@WebMvcTest的自动配置逻辑:@ExtendWith(MockitoExtension.class)、@WebAppConfiguration在使用@WebMvcTest时都不需要重复添加,手动@InjectMocks注入Controller、注入WebApplicationContext也是多余操作。
解决方案
直接删除测试类里的冗余注解和没用的注入字段即可,修正后的测试类代码如下:
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.ArrayList; import java.util.List; import org.hamcrest.Matchers; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Description; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import com.bnpp.leavemanagement.controller.DepartmentController; import com.bnpp.leavemanagement.model.DepartmentModel; import com.bnpp.leavemanagement.service.DepartmentService; @WebMvcTest(DepartmentController.class) public class DepartmentControllerTest { @MockBean DepartmentService depService; @Autowired private MockMvc mockMvc; @Test @Description("Should return a list of DepartmentModel objects when called") void shouldReturnListOfDepartmentModel() throws Exception { DepartmentModel depModel = new DepartmentModel(); depModel.setId(1L); depModel.setName("Mock"); List<DepartmentModel> listDepmodel = new ArrayList<>(); listDepmodel.add(depModel); Mockito.when(depService.getAllDepartments()).thenReturn(listDepmodel); mockMvc.perform(MockMvcRequestBuilders.get("/department")) .andDo(print()) .andExpect(status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.size()", Matchers.is(1))) .andExpect(MockMvcResultMatchers.jsonPath("$[0].id").value(1)) .andExpect(MockMvcResultMatchers.jsonPath("$[0].name").value("Mock")); } }
额外注意
如果修改后依然有问题,检查你的Spring Boot启动类是否放在com.bnpp.leavemanagement根包下,保证@WebMvcTest可以正常扫描到Controller类。
内容的提问来源于stack exchange,提问作者harish
相关产品推荐
相关产品推荐

