在 JDK 21 上用 PostgreSQL 真实验证 RowSet:CachedRowSet 断开连接后离线增删改并 acceptChanges 写回(要 autocommit=false,否则改动已提交却抛异常);写回前先 SELECT 比较原值做乐观冲突检测;WebRowSet XML、序列化、FilteredRowSet、JoinRowSet、分页、JdbcRowSet。
用自己起的 PostgreSQL 与 MySQL 跑真实的 XA 两阶段提交:start / end / prepare / commit 的流程、prepare 之后数据仍不可见、PG 延迟约束在 PREPARE 时失败触发回滚、协调者在 prepare 之后崩溃留下握着锁的 in-doubt 分支并通过 recover() 恢复、两阶段每次提交约 0.61 ms(单库本地 0.19 ms)。
用两个 JVM 真实运行 Java RMI:stub 是动态代理、监听两个端口、一次本机调用约 0.072 ms;参数按值而 Remote 对象按引用;异常原样穿过;JEP 290 过滤器拒绝 ArrayList;DGC 租约到期后 unreferenced() 在 3.01 秒后被调用、clean 调用则在 0.01 秒内。
在 JDK 21 上真实运行 JNDI:没有提供者时的 NoInitialContextException、自己写的 InitialContextFactory、JDK 自带的 RMI Registry 提供者(只能 bind Remote / Reference / Referenceable)、JDK 的 LDAP 提供者对接 UnboundID 内存 LDAP 服务器的查询与修改及错误映射。
用 JUnit 5.11.3 真实打印扩展回调的完整顺序:before 类按注册顺序、after 类反过来;异常处理器吞掉异常后后面的处理器不再被调用;TestWatcher 的三种回调;Store 在根 / 类 / 方法三级的 CloseableResource 关闭时机;@RegisterExtension 与 @ExtendWith 的注册顺序。
用 JUnit 5.11.3 真实运行参数化测试:@ValueSource、@CsvSource(引号、nullValues、空串)、@EnumSource、@MethodSource、@NullSource + @EmptySource 的调用次数与显示名;隐式 / 显式转换与聚合;参数数量不匹配与空来源的错误;每次调用都构造新实例并运行 BeforeEach / AfterEach,失败只影响自己。
用 JUnit 5.11.3 真实运行 @TestFactory:BeforeEach / AfterEach 只对工厂方法执行一次;失败的动态测试单独标记;DynamicContainer 嵌套;惰性 Stream 边产生边执行,onClose 在 AfterEach 之前;错误返回类型、工厂抛异常、空流;动态测试共享同一个实例。
用 jqwik 1.9.1 真实运行属性测试:1000 次随机调用加边界值混入;溢出缺陷的平均值被找到并收缩成 (-1, -2147483648);第二次运行从 .jqwik-database 重放失败样本(tries = 1);Integer.MIN_VALUE 的 abs 缺陷;列表缺陷 11 个元素收缩成 [0, 0, 0, 0, 0, 0];Assume、穷举与统计。
用 PIT 1.17.2 对同一个类跑三套测试:弱测试集行覆盖率 86% 却只杀死 29 个变异里的 10 个(34%);断言具体值并测边界后 83%;调整测试数据与补一个断言后 90%,剩下 3 个存活的是等价变异。逐个变异器、逐行列出存活的变异。
用 japicmp 0.23.1 比较库的两个版本,并用针对 1.0 编译的 15 个客户端在 2.0 上真实运行、再对 2.0 重新编译,逐项对照二进制 / 源码兼容性:10 个在 2.0 上运行失败(NoSuchMethodError、AbstractMethodError、IncompatibleClassChangeError、IllegalAccessError ……);I4、C14、C10 三处工具报告与实测不一致。
用 JUnit 5.11.3 在模块路径下测试一个 JPMS 模块:黑盒只能用导出的 API;去碰未导出的包编译期报 not visible、运行期 IllegalAccessError;白盒用 --patch-module 与 --add-reads,运行时还要 --add-opens 否则 4 个测试全部失败;同样的测试在类路径里毫无限制。
用 JDK 21 的 jdeprscan 扫描编译好的 jar:自己写的类里 9 种废弃 API 的使用点(--for-removal 只剩 5 条),--release 8 / 11 / 17 / 21 发现 2 / 6 / 7 / 10 条,废弃清单 471 → 681 条(for removal 10 → 103 条),并扫描 commons-lang 2.6、log4j 1.2.17、guava 18.0 里的 32 / 29 / 7 条。