IntelliJ未将预期失败测试用例识别为测试成功问题求助
问题分析与解决方案
你的测试用例未通过的核心原因是:代码实际抛出的是RuntimeException(包裹了HttpParsingException作为根因),但你的测试只捕获了HttpParsingException,导致catch块完全没触发,测试因未捕获的异常失败。
从控制台栈跟踪能清楚看到:
java.lang.RuntimeException: com.gui.httpserver.http.HttpParsingException: Not Implemented
parseHttpRequest方法把业务异常HttpParsingException包装成了RuntimeException抛出,而你的try/catch只监听HttpParsingException,自然抓不到这个异常。
两种解决思路
思路1:修正核心代码(推荐)
直接让parseHttpRequest抛出HttpParsingException而非包装成RuntimeException,这更符合业务异常的设计逻辑——解析错误是预期的业务异常,不需要用RuntimeException包装。
修改HttpParser类的parseHttpRequest方法,把throws声明改为throws HttpParsingException,并移除RuntimeException的包装逻辑,这样原来的测试代码就能正常捕获异常并验证。
思路2:调整测试用例(快速适配)
如果暂时不想改动核心代码,修改测试用例捕获RuntimeException,再检查其内部的根因:
@Test void parseHttpRequestBadMethod1 () { try { HttpRequest request = httpParser.parseHttpRequest(generateBadTestCaseMethodName()); fail("未抛出预期的解析异常"); } catch (RuntimeException e) { // 验证异常根因是HttpParsingException assertInstanceOf(HttpParsingException.class, e.getCause()); HttpParsingException parsingEx = (HttpParsingException) e.getCause(); assertEquals(parsingEx.getErrorCode(), HttpStatusCode.SERVER_ERROR_501_NOT_IMPLEMENTED); } }
如果是JUnit 5,还可以用更简洁的assertThrows写法:
@Test void parseHttpRequestBadMethod1 () { RuntimeException thrown = assertThrows(RuntimeException.class, () -> httpParser.parseHttpRequest(generateBadTestCaseMethodName())); assertInstanceOf(HttpParsingException.class, thrown.getCause()); HttpParsingException parsingEx = (HttpParsingException) thrown.getCause(); assertEquals(parsingEx.getErrorCode(), HttpStatusCode.SERVER_ERROR_501_NOT_IMPLEMENTED); }
调整后,测试就能正确捕获异常并验证错误码,从而标记为成功。
内容的提问来源于stack exchange,提问作者Guilherme Guerra
相关产品推荐
相关产品推荐

