From 41ea34a63429360a4e17733232d6a56c0afdbb7f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Dec 2025 02:02:22 +0000 Subject: [PATCH 1/6] Initial plan From 44ff4bbe2b3dd600d93cfea1bc70176b670e3fd0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Dec 2025 02:08:42 +0000 Subject: [PATCH 2/6] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20WxCpRedisConfigImpl=20?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=97=A0=E9=99=90=E9=80=92=E5=BD=92=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E9=97=AE=E9=A2=98=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../cp/config/impl/WxCpRedisConfigImpl.java | 2 +- .../config/impl/WxCpRedisConfigImplTest.java | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java index 15c0ff672..49cd7c455 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImpl.java @@ -468,7 +468,7 @@ public boolean autoRefreshToken() { @Override public String getWebhookKey() { - return this.getWebhookKey(); + return this.webhookKey; } @Override diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java new file mode 100644 index 000000000..db36a08d2 --- /dev/null +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java @@ -0,0 +1,51 @@ +package me.chanjar.weixin.cp.config.impl; + +import org.testng.Assert; +import org.testng.annotations.Test; +import redis.clients.jedis.JedisPool; + +/** + * WxCpRedisConfigImpl 测试类 + * + * @author Copilot + */ +public class WxCpRedisConfigImplTest { + + /** + * 测试 getWebhookKey 方法不会导致无限递归 + * 这个测试验证了 #issue 中提到的无限递归问题已被修复 + */ + @Test + public void testGetWebhookKeyNoInfiniteRecursion() { + // 创建一个 mock JedisPool(不需要真实连接) + JedisPool jedisPool = new JedisPool("localhost", 6379); + + try { + WxCpRedisConfigImpl config = new WxCpRedisConfigImpl(jedisPool); + + // 测试1: webhookKey 为 null 时应该返回 null,而不是抛出 StackOverflowError + String webhookKey = config.getWebhookKey(); + Assert.assertNull(webhookKey, "未设置 webhookKey 时应返回 null"); + + // 测试2: 通过反射设置 webhookKey,然后验证能够正确获取 + // 注意:由于 WxCpRedisConfigImpl 没有提供 setWebhookKey 方法, + // 我们通过反射来设置这个字段以测试 getter 的正确性 + try { + java.lang.reflect.Field field = WxCpRedisConfigImpl.class.getDeclaredField("webhookKey"); + field.setAccessible(true); + String testWebhookKey = "test-webhook-key-123"; + field.set(config, testWebhookKey); + + String retrievedKey = config.getWebhookKey(); + Assert.assertEquals(retrievedKey, testWebhookKey, "应该返回设置的 webhookKey 值"); + } catch (NoSuchFieldException | IllegalAccessException e) { + Assert.fail("反射设置 webhookKey 失败: " + e.getMessage()); + } + } finally { + // 清理资源 + if (jedisPool != null && !jedisPool.isClosed()) { + jedisPool.close(); + } + } + } +} From 32158d2ea56b92a01df557ea226f067197abd7cf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Dec 2025 02:12:57 +0000 Subject: [PATCH 3/6] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=B1=BB=E4=B8=AD=E4=B8=8D=E5=BF=85=E8=A6=81=E7=9A=84=E4=BD=9C?= =?UTF-8?q?=E8=80=85=E6=A0=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java index db36a08d2..8ef25c863 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java @@ -6,8 +6,6 @@ /** * WxCpRedisConfigImpl 测试类 - * - * @author Copilot */ public class WxCpRedisConfigImplTest { From 8c07b16941d6c391903d0fc9512ba8cebb450c55 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 24 Dec 2025 15:49:39 +0800 Subject: [PATCH 4/6] Update weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../cp/config/impl/WxCpRedisConfigImplTest.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java index 8ef25c863..874d459b9 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java @@ -30,12 +30,17 @@ public void testGetWebhookKeyNoInfiniteRecursion() { // 我们通过反射来设置这个字段以测试 getter 的正确性 try { java.lang.reflect.Field field = WxCpRedisConfigImpl.class.getDeclaredField("webhookKey"); + boolean originalAccessible = field.isAccessible(); field.setAccessible(true); - String testWebhookKey = "test-webhook-key-123"; - field.set(config, testWebhookKey); - - String retrievedKey = config.getWebhookKey(); - Assert.assertEquals(retrievedKey, testWebhookKey, "应该返回设置的 webhookKey 值"); + try { + String testWebhookKey = "test-webhook-key-123"; + field.set(config, testWebhookKey); + + String retrievedKey = config.getWebhookKey(); + Assert.assertEquals(retrievedKey, testWebhookKey, "应该返回设置的 webhookKey 值"); + } finally { + field.setAccessible(originalAccessible); + } } catch (NoSuchFieldException | IllegalAccessException e) { Assert.fail("反射设置 webhookKey 失败: " + e.getMessage()); } From ab9cc337be9509580f8de5e556c33cef02e4c0f5 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Wed, 24 Dec 2025 15:49:53 +0800 Subject: [PATCH 5/6] Update weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java index 874d459b9..8bc9a2ab0 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java @@ -46,7 +46,7 @@ public void testGetWebhookKeyNoInfiniteRecursion() { } } finally { // 清理资源 - if (jedisPool != null && !jedisPool.isClosed()) { + if (!jedisPool.isClosed()) { jedisPool.close(); } } From 210d9e55c38ce55ae84ea3a68c1483a838a9d761 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Dec 2025 07:53:13 +0000 Subject: [PATCH 6/6] =?UTF-8?q?=E4=BD=BF=E7=94=A8=20Mockito=20mock=20Jedis?= =?UTF-8?q?Pool=20=E9=81=BF=E5=85=8D=E6=B5=8B=E8=AF=95=E6=97=B6=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E=E8=BF=9E=E6=8E=A5=20Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com> --- .../config/impl/WxCpRedisConfigImplTest.java | 54 +++++++++---------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java index 8bc9a2ab0..1a7fdccbd 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/config/impl/WxCpRedisConfigImplTest.java @@ -1,5 +1,6 @@ package me.chanjar.weixin.cp.config.impl; +import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.Test; import redis.clients.jedis.JedisPool; @@ -15,40 +16,33 @@ public class WxCpRedisConfigImplTest { */ @Test public void testGetWebhookKeyNoInfiniteRecursion() { - // 创建一个 mock JedisPool(不需要真实连接) - JedisPool jedisPool = new JedisPool("localhost", 6379); - + // 使用 Mockito 创建 mock JedisPool,避免真实连接 + JedisPool jedisPool = Mockito.mock(JedisPool.class); + + WxCpRedisConfigImpl config = new WxCpRedisConfigImpl(jedisPool); + + // 测试1: webhookKey 为 null 时应该返回 null,而不是抛出 StackOverflowError + String webhookKey = config.getWebhookKey(); + Assert.assertNull(webhookKey, "未设置 webhookKey 时应返回 null"); + + // 测试2: 通过反射设置 webhookKey,然后验证能够正确获取 + // 注意:由于 WxCpRedisConfigImpl 没有提供 setWebhookKey 方法, + // 我们通过反射来设置这个字段以测试 getter 的正确性 try { - WxCpRedisConfigImpl config = new WxCpRedisConfigImpl(jedisPool); - - // 测试1: webhookKey 为 null 时应该返回 null,而不是抛出 StackOverflowError - String webhookKey = config.getWebhookKey(); - Assert.assertNull(webhookKey, "未设置 webhookKey 时应返回 null"); - - // 测试2: 通过反射设置 webhookKey,然后验证能够正确获取 - // 注意:由于 WxCpRedisConfigImpl 没有提供 setWebhookKey 方法, - // 我们通过反射来设置这个字段以测试 getter 的正确性 + java.lang.reflect.Field field = WxCpRedisConfigImpl.class.getDeclaredField("webhookKey"); + boolean originalAccessible = field.isAccessible(); + field.setAccessible(true); try { - java.lang.reflect.Field field = WxCpRedisConfigImpl.class.getDeclaredField("webhookKey"); - boolean originalAccessible = field.isAccessible(); - field.setAccessible(true); - try { - String testWebhookKey = "test-webhook-key-123"; - field.set(config, testWebhookKey); + String testWebhookKey = "test-webhook-key-123"; + field.set(config, testWebhookKey); - String retrievedKey = config.getWebhookKey(); - Assert.assertEquals(retrievedKey, testWebhookKey, "应该返回设置的 webhookKey 值"); - } finally { - field.setAccessible(originalAccessible); - } - } catch (NoSuchFieldException | IllegalAccessException e) { - Assert.fail("反射设置 webhookKey 失败: " + e.getMessage()); - } - } finally { - // 清理资源 - if (!jedisPool.isClosed()) { - jedisPool.close(); + String retrievedKey = config.getWebhookKey(); + Assert.assertEquals(retrievedKey, testWebhookKey, "应该返回设置的 webhookKey 值"); + } finally { + field.setAccessible(originalAccessible); } + } catch (NoSuchFieldException | IllegalAccessException e) { + Assert.fail("反射设置 webhookKey 失败: " + e.getMessage()); } } }