Jersey接口Spring MockMvc测试出现404状态码问题求助
咱们来一步步解决你遇到的这个断言错误——预期200但返回404的问题,从你的代码和技术栈来看,核心问题出在测试工具的兼容性和依赖注入的匹配上:
1. 核心问题:Spring MockMvc 不支持 Jersey 控制器
你用**Jersey(JAX-RS)**来编写REST接口,但是测试时用的是Spring MVC的MockMvc工具。MockMvc只能识别Spring MVC的@RequestMapping、@GetMapping等注解,完全不认识Jersey的@Path、@GET这些JAX-RS注解。所以当你用MockMvc发起请求时,根本找不到对应的接口映射,自然返回404。
解决办法:改用Jersey官方测试框架
你需要使用Jersey Test Framework,这是专门为测试Jersey编写的REST服务设计的工具,能正确识别JAX-RS注解,模拟请求并验证响应。
2. 依赖注入的错误
看你的LogController代码,服务实例是直接new出来的:
private LoggerService loggerService = new LoggerService();
而测试类里你Mock的是LoggerServiceLua,还想用@InjectMocks注入到LogController——这完全不匹配:控制器里的字段是LoggerService类型,测试里Mock的是另一个类型,Mockito根本没法把Mock实例注入进去,这不仅会导致测试逻辑失效,也不符合依赖注入的最佳实践。
解决办法:
- 把控制器里的
LoggerService改成依赖注入方式(比如构造函数注入,或者Spring的@Autowired),不要直接new实例; - 确保测试类里Mock的类型和控制器的字段类型完全一致,比如控制器用
LoggerService,测试就MockLoggerService,而不是LoggerServiceLua。
3. Jersey Test Framework 测试示例
给你一个适配你的场景的测试代码示例,你可以参考修改:
import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.test.JerseyTest; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; public class LogControllerTest extends JerseyTest { // 正确Mock控制器依赖的类型 private LoggerService mockLoggerService = mock(LoggerService.class); @Override protected ResourceConfig configure() { // 初始化控制器,并注入Mock的服务实例 LogController logController = new LogController(mockLoggerService); // 假设你改成了构造函数注入 // 注册控制器到Jersey测试环境 return new ResourceConfig().register(logController); } @Test public void testGetLogServerInfo() throws Exception { // 预设Mock服务的返回值 String mockResponse = "{\"_id\":\"log_server\",\"_rev\":\"24-86181b008b62e31b2403852bf70fb8ce\",\"ip_address\":\"192.23.24.12\",\"port\":\"000\"}"; when(mockLoggerService.getLogServerInfo()).thenReturn(mockResponse); // 发起请求并验证结果 String response = target("/getLogServerInfo") // 对应控制器的@Path路径 .request() .get(String.class); // 验证响应内容和调用次数 assertEquals(mockResponse, response); verify(mockLoggerService, times(1)).getLogServerInfo(); verifyNoMoreInteractions(mockLoggerService); } }
同时需要在Maven的pom.xml中添加Jersey Test的依赖(版本和你的Jersey主版本保持一致):
<dependency> <groupId>org.glassfish.jersey.test-framework.providers</groupId> <artifactId>jersey-test-framework-provider-grizzly2</artifactId> <version>你的Jersey版本号</version> <scope>test</scope> </dependency>
总结
先解决测试框架的兼容性问题,替换成Jersey Test Framework,再修复依赖注入的类型匹配问题,这样就能正确测试你的Jersey REST接口,解决404的问题了。
内容的提问来源于stack exchange,提问作者user3518405

