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

JUnit+Jersey测试REST API时出现HTTP 404 NotFound错误求助

解决JUnit测试REST API时的404 NotFound错误

嗨,我来帮你排查这个404问题。看了你的代码和错误日志,主要有几个核心问题需要修正,咱们一步步来:

1. 请求路径完全不匹配

先看你的配置逻辑:

  • web.xml里把Jersey Servlet映射到了/rest/*
  • LogControllerLua的根路径是@Path("/"),方法的路径是@Path("/getLogServerInfo")
  • 但你测试里写的请求路径是target("/API/rest/getLogServerInfo")

正确的请求路径应该是/rest/getLogServerInfo——你多写了/API前缀,这是导致404的直接原因。

2. Mock的服务根本没被用到

你虽然用了@Mock和@InjectMocks,但JerseyTest默认会自己创建Controller实例,而不是用你通过Mockito初始化的那个。再加上你的Controller里是直接new LoggerServiceLua(),不是依赖注入,这就导致:

  • 你Mock的loggerServiceLua完全没生效
  • 测试时Controller还是调用真实的服务逻辑

修正步骤:

首先把Controller改成依赖注入模式,去掉硬编码的new:

@Api(value = "/")
@Path("/")
public class LogControllerLua {
    private Logger logger = LoggerFactory.getLogger(LogControllerLua.class);
    
    // 用@Inject实现依赖注入(Jersey原生支持)
    @Inject
    private LoggerServiceLua loggerServiceLua;

    // 提供带参构造,方便测试时注入Mock实例
    public LogControllerLua() {}
    
    public LogControllerLua(LoggerServiceLua loggerServiceLua) {
        this.loggerServiceLua = loggerServiceLua;
    }

    @GET
    @Path("/getLogServerInfo")
    public String getLogServerInfo(@Context HttpHeaders httpheaders) throws Exception {
        // 这里调用loggerServiceLua的方法即可
        return loggerServiceLua.getLogServerInfo();
    }
}

然后修改测试类,让JerseyTest使用你Mock好的Controller实例:

public class LogControllerLuaTest extends JerseyTest {
    @Mock
    private LoggerServiceLua loggerServiceLua;

    private LogControllerLua logControllerLua;

    @Override
    protected Application configure() {
        // 初始化Mockito
        MockitoAnnotations.initMocks(this);
        // 手动创建Controller并注入Mock服务
        logControllerLua = new LogControllerLua(loggerServiceLua);
        // 注册这个实例到ResourceConfig,而不是让Jersey自动创建
        return new ResourceConfig().register(logControllerLua);
    }

    @Test
    public void testgetLogServerInfo() throws Exception {
        String mockResponse = "some data";
        // 打桩Mock方法
        when(loggerServiceLua.getLogServerInfo()).thenReturn(mockResponse);
        
        // 用正确的路径请求
        String actualResponse = target("/rest/getLogServerInfo").request().get(String.class);
        
        // 断言结果
        Assert.assertEquals(mockResponse, actualResponse);
    }
}

3. 清理冗余代码

你的测试类里有重复的@Test、@Before注解和重复的import语句,建议清理掉,避免编译警告或者逻辑混乱。

另外,原来的JerseyConfig如果是用于生产环境的,测试时不需要用它——直接在configure方法里注册Mock好的实例更适合单元测试场景。

按上面的步骤修改后,404问题应该能解决,同时你的Mock也能正常生效了。

内容的提问来源于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 09:55:19