JUnit中测试含try/catch的方法时如何屏蔽指定用例的异常栈打印
方案1:零生产代码改动,临时重定向System.err
e.printStackTrace()默认会输出到标准错误流System.err,你可以在单个测试的执行周期内临时替换System.err为无操作输出流,测试完成后立刻恢复原有流,完全不会影响其他测试的日志输出:
import java.io.OutputStream; import java.io.PrintStream; @Test public void testExtractJacksonObjectsFromFile_malformedJson_expectNull(){ // 保存原有System.err引用 PrintStream originalErr = System.err; try { // 替换为无任何输出的空流 System.setErr(new PrintStream(OutputStream.nullOutputStream())); // 执行原有测试逻辑 String malformedJson = "{"; ObjectTransferData result = myService.extractJacksonObjectsFromFile(malformedJson); assertNull(result); } finally { // 恢复原有System.err,后续测试的异常输出不受影响 System.setErr(originalErr); } }
方案2:优化生产代码规范,通过日志框架控制输出
生产环境本身不推荐直接使用e.printStackTrace(),它不会写入日志文件,排查问题效率极低,建议替换为标准日志框架输出,测试时临时调整对应类的日志级别即可:
生产代码改造
import org.slf4j.Logger; import org.slf4j.LoggerFactory; // 类中初始化Logger private static final Logger log = LoggerFactory.getLogger(YourServiceClassName.class); public ObjectTransferData extractJacksonObjectsFromFile(String json) { ObjectTransferData objectTransferData; try { objectTransferData = objectMapper.readValue(json, ObjectTransferData.class); } catch (Exception e) { log.error("JSON字符串解析失败", e); objectTransferData = null; } return objectTransferData; }
测试代码(以Logback为例)
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import org.slf4j.LoggerFactory; @Test public void testExtractJacksonObjectsFromFile_malformedJson_expectNull(){ LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); ch.qos.logback.classic.Logger serviceLogger = loggerContext.getLogger(YourServiceClassName.class); // 保存原有日志级别 Level originalLevel = serviceLogger.getLevel(); try { // 临时关闭当前类的错误日志输出 serviceLogger.setLevel(Level.OFF); // 执行原有测试逻辑 String malformedJson = "{"; ObjectTransferData result = myService.extractJacksonObjectsFromFile(malformedJson); assertNull(result); } finally { // 恢复原有日志级别 serviceLogger.setLevel(originalLevel); } }
两个方案都只会影响当前单测的输出,不会屏蔽其他测试的真实异常日志,同时保留了生产环境的异常捕获降级逻辑。
内容的提问来源于stack exchange,提问作者Bishares
相关产品推荐
相关产品推荐

