Spring Boot环境下JUnit如何mock静态方法为指定测试类开启trace日志校验
实现方案
核心思路
你使用的是Slf4j+Logback的技术栈,可以直接通过Logback自带的API动态调整指定类的日志级别,测试执行完成后再恢复原有级别即可,不会影响其他测试类的日志配置,也不需要引入额外的测试依赖。
代码实现
直接修改你的测试类即可,完整代码如下:
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.slf4j.LoggerFactory; import java.util.Calendar; public class ClassUnderTestUnitTest{ // 保存待测类对应的Logback Logger实例和原始级别 private ch.qos.logback.classic.Logger targetLogger; private Level originalLevel; @Before public void beforeTest() { // 获取Logback的日志上下文 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); targetLogger = context.getLogger(ClassUnderTest.class); // 先保存原有日志级别 originalLevel = targetLogger.getLevel(); // 临时设置为TRACE级别,此时isTraceEnabled()就会返回true targetLogger.setLevel(Level.TRACE); } @After public void afterTest() { // 测试结束后恢复原来的日志级别,避免影响其他测试用例 if (targetLogger != null && originalLevel != null) { targetLogger.setLevel(originalLevel); } } @Test public void findeSnapshotMitLueke() { ClassUnderTest toTestInstance = new ClassUnderTest(); // 执行方法时,trace日志已经开启,会执行if(LOGGER.isTraceEnabled())包裹的逻辑 toTestInstance.doSomething(Calendar.getInstance()); // 这里补充你的业务断言,验证逻辑执行结果正确即可 } }
注意事项
- Spring Boot默认引入的
spring-boot-starter-logging已经包含了Logback的相关依赖,不需要额外引入第三方包就能直接使用上述代码。 - 如果你的测试类用的是JUnit 5,把
@Before替换成@BeforeEach,@After替换成@AfterEach即可,逻辑完全一致。 - 不推荐使用PowerMock修改静态常量的方案,会引入额外依赖,且处理不当容易污染其他测试的上下文。
内容的提问来源于stack exchange,提问作者BetaRide
相关产品推荐
相关产品推荐

