MockWebServer server = new MockWebServer(); server.start(); int port = server.getPort();
JUnit 5 开了并行,两个测试类都起 MockWebServer,第二个报 java.net.BindException Address already in use,端口写的是 8089。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:端口是硬编码的,两个线程同时 bind 同一个值,先到的赢。并行度一调高,撞上的概率接近必然。
这次卡住的地方就在「并行测试端口冲突」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
处理上按这个顺序:让服务监听 0 端口 由系统分配 再从实例上取真实端口;端口通过参数传给被测代码 不在配置里写死;必须固定端口就按类名算偏移;并行度调回 1 复跑 确认不是时序问题。
确认没问题再收工,并行跑十轮没有再出现 BindException 每个类拿到的端口都不一样。
