不幸的是,Surefire、JUnit 的 Vintage 引擎和 Spring Framework 的测试框架的组合似乎还没有准备好迎接黄金时期。
使用 Vintage 引擎时,测试运行程序在创建测试描述期间执行的任何日志记录都会破坏主 Maven JVM 和运行测试的 JVM 之间的 Surefire 通信链路。这可以通过 Surefire 记录类似于以下内容的警告来识别:
[WARNING] Corrupted STDOUT by directly writing to native stream in forked JVM 1. See FAQ web page and the dump file …/target/surefire-reports/2018-12-12T09-56-36_709-jvmRun1.dumpstream
我相信这是 Surefire 中的一个错误。看起来,当使用 Vintage 引擎时,跑步者会在 Surefire 无法处理 System.out 的输出时被提前调用。我已经打开了SUREFIRE-1614。
Spring Framework 的测试框架在测试描述创建期间定期在信息级别记录日志。登录AbstractContextLoader.generateDefaultLocations(Class<?>)
就是一个例子。这意味着,如果我们将启动器切换到 Vintage 引擎并鼓励从 JUnit 4 API 温和迁移到 JUnit Jupiter API,则通信损坏和输出警告将成为一个常见问题。
解决方法是使用logback-test.xml
或来调整日志记录配置,以便在 Surefire 能够处理此类输出之前log4j2-test.xml
不会写入任何内容。System.out
不幸的是,这需要一定量的试验和错误,因为具体记录的内容和时间取决于正在使用的特定运行程序和测试配置。