diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java index fd8819272..6fd7187c2 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/api/WxMessageInMemoryDuplicateCheckerTest.java @@ -9,9 +9,8 @@ import static org.testng.Assert.assertTrue; @Test public class WxMessageInMemoryDuplicateCheckerTest { - private WxMessageInMemoryDuplicateChecker checker = new WxMessageInMemoryDuplicateChecker(2000L, 1000L); - public void test() throws InterruptedException { + WxMessageInMemoryDuplicateChecker checker = new WxMessageInMemoryDuplicateChecker(2000L, 1000L); Long[] msgIds = new Long[]{1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L}; // 第一次检查 @@ -20,18 +19,22 @@ public class WxMessageInMemoryDuplicateCheckerTest { assertFalse(result); } - // 过1秒再检查 - TimeUnit.SECONDS.sleep(1); + // 未过期时应识别为重复消息 for (Long msgId : msgIds) { boolean result = checker.isDuplicate(String.valueOf(msgId)); assertTrue(result); } - // 过1.5秒再检查 - TimeUnit.MILLISECONDS.sleep(1500L); + // 过期记录由后台线程定期清理,不能假定 TTL 到达后立即被删除。 + long deadline = System.nanoTime() + TimeUnit.SECONDS.toNanos(10); for (Long msgId : msgIds) { boolean result = checker.isDuplicate(String.valueOf(msgId)); - assertFalse(result); + while (result && System.nanoTime() < deadline) { + TimeUnit.MILLISECONDS.sleep(20L); + result = checker.isDuplicate(String.valueOf(msgId)); + } + assertFalse(result, "Expired message was not cleared: " + msgId); + assertTrue(checker.isDuplicate(String.valueOf(msgId))); } }