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
相关产品推荐
相关产品推荐

