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

Jersey接口Spring MockMvc测试出现404状态码问题求助

排查REST接口测试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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:20:21