我將 Spring Boot 從 2.5.10 升級到 2.5.12,它為我在 logback https://github.com/spring-projects/spring-boot/releases/tag/v2.5.11中帶來了重大變化
我的一些單元測驗(使用 Mockito)因 NullPointerException 而中斷,我將模擬例外傳遞給主代碼中的日志行。例如,這是我在主代碼中的日志行,并且該類使用 lombok 的 @Slf4j 進行注釋
log.warn("Exception occurred while doing something", exception);
早些時候,這個日志行沒有拋出任何錯誤。
我的意圖是不模擬記錄器,而是通過任何可能的解決方法忽略這條線(即使我必須模擬它)。
Lombok 在編譯時添加了以下內容(不確定模擬是否可以在這里作業):
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(HelloWorld.class);
我的一種解決方法是不使用模擬例外并傳遞一個實際的例外,但這會讓單元測驗失去樂趣。
堆疊跟蹤:
java.lang.NullPointerException
at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:99)
at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:62)
at ch.qos.logback.classic.spi.LoggingEvent.<init>(LoggingEvent.java:119)
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:419)
at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
at ch.qos.logback.classic.Logger.warn(Logger.java:692)
at com.example.r.e.d.s.d.t.HelloWorld.executeInternal(HelloWorld.java:74)
at com.example.r.e.d.s.d.t.HelloWorldTest.testLocksOnDomain(HelloWorldTest.java:94)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.mockito.internal.runners.DefaultInternalRunner$1$1.evaluate(DefaultInternalRunner.java:54)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
at org.mockito.internal.runners.DefaultInternalRunner$1.run(DefaultInternalRunner.java:99)
at org.mockito.internal.runners.DefaultInternalRunner.run(DefaultInternalRunner.java:105)
at org.mockito.internal.runners.StrictRunner.run(StrictRunner.java:40)
at org.mockito.junit.MockitoJUnitRunner.run(MockitoJUnitRunner.java:163)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Process finished with exit code 255
此外,我的單元測驗與以前的庫版本一起作業。有一個問題是,在執行單元測驗的程序中,它曾經在控制臺中列印諸如 WARN 和 ERROR 之類的日志(這有時會造成很多混亂)。
uj5u.com熱心網友回復:
導致錯誤的行(在您提到的版本中)如下所示(請參閱https://github.com/qos-ch/logback/blob/v_1.2.11/logback-classic/src/main/java/ch /qos/logback/classic/spi/ThrowableProxy.java#L99):
if (throwableSuppressed.length > 0) {
值得注意的是,您的問題有一個修復程式,盡管我不知道現在或將來哪個版本的 Logback 可能有它。https://github.com/qos-ch/logback/commit/c34645b320d2b31ccaf0de9bb079391904352a28包含以下相關更改:替換
if (throwableSuppressed.length > 0) {
和
// while JDK's implementation of getSuppressed() will always return a non-null array,
// this might not be the case in mocked throwables. We are being extra defensive here.
if (OptionHelper.isNotEmtpy(throwableSuppressed)) {
我自己通常不太熱衷于嘲笑例外。但是,如果這是您的背景關系所要求的,那么模擬 getSuppressed() 以回傳一個非空(可能是空的)陣列可能會解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/457272.html
上一篇:模塊模式變數在測驗中回傳未定義?
