From 1bcb7b38731986f289775a0b1a110fe7b5f0314d Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sun, 13 Sep 2026 12:06:07 +0800 Subject: [PATCH] =?UTF-8?q?:=20white=5Fcheck=5Fmark:=20=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E7=A6=BB=E7=BA=BF=E6=B5=8B=E8=AF=95=E9=97=A8=E7=A6=81=E5=B9=B6?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A7=A3=E6=9E=90=E4=B8=8E=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/maven-test.yml | 30 +++++ .gitignore | 1 + docs/testing.md | 21 ++++ pom.xml | 3 +- .../pom.xml | 12 ++ .../WxAispeechKnowledgeServiceImplTest.java | 2 +- .../aispeech/util/WxAispeechSignUtilTest.java | 6 +- .../weixin/common/bean/WxMenuTest.java | 2 +- .../common/util/crypto/WxCryptUtilTest.java | 2 +- .../src/test/resources/testng.xml | 2 +- weixin-java-cp/pom.xml | 34 ++++-- .../weixin/cp/bean/message/WxCpMessage.java | 12 +- .../bean/templatecard/TemplateCardButton.java | 4 +- .../weixin/cp/api/WxCpBusyRetryTest.java | 108 ++++++++---------- .../weixin/cp/api/WxCpMessageRouterTest.java | 20 ++-- .../cp/bean/message/WxCpXmlMessageTest.java | 4 +- .../impl/WxCpTpTagServiceImplTest.java | 4 +- weixin-java-cp/src/test/resources/testng.xml | 4 - .../mp/bean/message/ArticleUrlResult.java | 2 + .../weixin/mp/bean/message/SendPicsInfo.java | 2 + .../weixin/mp/api/WxMpBusyRetryTest.java | 7 +- .../chanjar/weixin/mp/api/WxMpJsAPITest.java | 7 -- .../weixin/mp/api/WxMpMessageRouterTest.java | 32 ++++-- .../mp/bean/message/WxMpXmlItemTypesTest.java | 21 ++++ .../message/WxMpXmlOutNewsMessageTest.java | 2 +- weixin-java-mp/src/test/resources/testng.xml | 7 +- weixin-java-pay/pom.xml | 14 +++ .../config/WxPayConfigPrivateKeyTest.java | 52 +++------ ...CertificatesVerifierPublicKeyModeTest.java | 33 +++++- weixin-java-pay/src/test/resources/testng.xml | 59 ++++++++++ .../weixin/qidian/api/WxMpBusyRetryTest.java | 7 +- .../weixin/qidian/api/WxMpJsAPITest.java | 7 -- .../src/test/resources/testng.xml | 20 ---- 33 files changed, 346 insertions(+), 197 deletions(-) create mode 100644 .github/workflows/maven-test.yml create mode 100644 docs/testing.md create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlItemTypesTest.java create mode 100644 weixin-java-pay/src/test/resources/testng.xml diff --git a/.github/workflows/maven-test.yml b/.github/workflows/maven-test.yml new file mode 100644 index 000000000..2b04539ae --- /dev/null +++ b/.github/workflows/maven-test.yml @@ -0,0 +1,30 @@ +name: Maven Tests + +on: + pull_request: + push: + branches: + - develop + +permissions: + contents: read + +concurrency: + group: maven-test-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout Code + uses: actions/checkout@v5 + - name: Set up Java + uses: actions/setup-java@v5 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Run Maven tests + run: mvn clean test -Dmaven.test.skip=false --no-transfer-progress diff --git a/.gitignore b/.gitignore index eda4f369c..3e4a5d5d3 100644 --- a/.gitignore +++ b/.gitignore @@ -61,3 +61,4 @@ docs/superpowers/ # Local Superpowers working documents; do not commit. /docs/superpowers/ /.firecrawl/ +.repo_memory/ diff --git a/docs/testing.md b/docs/testing.md new file mode 100644 index 000000000..4980b5d57 --- /dev/null +++ b/docs/testing.md @@ -0,0 +1,21 @@ +# Maven 测试 + +GitHub Actions 使用 Java 17 运行无需微信凭据的测试套件: + +```shell +mvn clean test -Dmaven.test.skip=false --no-transfer-progress +``` + +默认构建通过 `maven.test.skip=true` 跳过测试编译及执行。显式设置为 `false` 才会运行测试。 +各 SDK 模块的 `src/test/resources/testng.xml` 定义默认测试集合;新增离线测试时应将其注册到对应套件。 + +支付模块的默认套件涵盖 Bean、签名、配置及本地 Service 测试,不运行需要真实商户配置、证书或外部服务的示例。 +需要运行集成测试时,在本地准备模块要求的测试配置及凭据,并显式选择测试类,例如: + +```shell +mvn -pl weixin-java-pay -am test -Dmaven.test.skip=false \ + -Dtest=BaseWxPayServiceImplTest -Dsurefire.failIfNoSpecifiedTests=false +``` + +不要将真实测试配置或凭据提交到仓库。排查测试失败时查看模块的 `target/surefire-reports`。 +CP 的反射开放参数仅在 Java 9 及以上激活,Java 8 不传入 `--add-opens`。 diff --git a/pom.xml b/pom.xml index 75887b10f..43e1759e9 100644 --- a/pom.xml +++ b/pom.xml @@ -136,6 +136,7 @@ 1.8 1.8 + true UTF-8 4.5.13 @@ -425,7 +426,7 @@ maven-surefire-plugin 2.17 - true + ${maven.test.skip} diff --git a/spring-boot-starters/wx-java-pay-multi-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-multi-spring-boot-starter/pom.xml index 04ea63958..3962710d4 100644 --- a/spring-boot-starters/wx-java-pay-multi-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-pay-multi-spring-boot-starter/pom.xml @@ -14,6 +14,13 @@ 微信支付开发的 Spring Boot Starter::支持多公众号关联配置 + + + ch.qos.logback + logback-classic + 1.2.13 + test + com.github.binarywang weixin-java-pay @@ -29,6 +36,11 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + org.springframework.boot spring-boot-maven-plugin diff --git a/weixin-java-aispeech/src/test/java/me/chanjar/weixin/aispeech/api/impl/WxAispeechKnowledgeServiceImplTest.java b/weixin-java-aispeech/src/test/java/me/chanjar/weixin/aispeech/api/impl/WxAispeechKnowledgeServiceImplTest.java index eb1bf6a5a..b5bf5dd79 100644 --- a/weixin-java-aispeech/src/test/java/me/chanjar/weixin/aispeech/api/impl/WxAispeechKnowledgeServiceImplTest.java +++ b/weixin-java-aispeech/src/test/java/me/chanjar/weixin/aispeech/api/impl/WxAispeechKnowledgeServiceImplTest.java @@ -43,11 +43,11 @@ public class WxAispeechKnowledgeServiceImplTest { WxAispeechKnowledgeServiceImpl knowledgeService = new WxAispeechKnowledgeServiceImpl(service); List result = knowledgeService.listKnowledgeByIds(Arrays.asList("k1", "k2")); + Assert.assertEquals(service.lastQueryParams.get("ids"), "k1,k2"); KnowledgeMoveProgress progress = knowledgeService.getMoveProgress("task-1"); Assert.assertEquals(result.size(), 2); Assert.assertEquals(result.get(0).getId(), "k1"); - Assert.assertEquals(service.lastQueryParams.get("ids"), "k1,k2"); Assert.assertEquals(progress.getTaskId(), "task-1"); Assert.assertEquals(progress.getStatus(), "processing"); } diff --git a/weixin-java-aispeech/src/test/java/me/chanjar/weixin/aispeech/util/WxAispeechSignUtilTest.java b/weixin-java-aispeech/src/test/java/me/chanjar/weixin/aispeech/util/WxAispeechSignUtilTest.java index bee6d497b..e6534fe85 100644 --- a/weixin-java-aispeech/src/test/java/me/chanjar/weixin/aispeech/util/WxAispeechSignUtilTest.java +++ b/weixin-java-aispeech/src/test/java/me/chanjar/weixin/aispeech/util/WxAispeechSignUtilTest.java @@ -8,19 +8,19 @@ public class WxAispeechSignUtilTest { @Test public void testCalcDialogSign() { String sign = WxAispeechSignUtil.calcDialogSign("token123", 1711520394L, "abcdefghijklmn", "{\"env\":\"online\"}"); - Assert.assertEquals(sign, "db3f57ece7f56fef3ac512f97ef1f624"); + Assert.assertEquals(sign, "dfa822f53a8de6bd41e0ea1b8d23f3be"); } @Test public void testCalcKnowledgeSignature() { String signature = WxAispeechSignUtil.calcKnowledgeSignature("secret-key", 1677652288L, "nonce-abc", "request-1", "{\"a\":1}"); - Assert.assertEquals(signature, "bf31b89ef3008e1ef91f7057d8819d4c8d5f9e435f5657097cb8f7fbf69d4e73"); + Assert.assertEquals(signature, "5a525e13c491e312bb72a08ea5c3d2b7902bfe29121cbf42c2613f656ea94532"); } @Test public void testAesEncryptAndDecrypt() { - String aesKey = "q1Os1ZMe0nG28KUEx9lg3HjK7V5QyXvi212fzsgDqgz"; + String aesKey = java.util.Base64.getEncoder().withoutPadding().encodeToString(new byte[32]); String source = "{\"query\":\"你好\"}"; String encrypted = WxAispeechSignUtil.encryptAesCbcToBase64(source, aesKey); diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java index 506b2dbac..3ff88513f 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/bean/WxMenuTest.java @@ -143,7 +143,7 @@ public class WxMenuTest { + "}" + "]," + "\"matchrule\":{" - + "\"group_id\":\"2\"," + + "\"tag_id\":\"2\"," + "\"sex\":\"1\"," + "\"country\":\"中国\"," + "\"province\":\"广东\"," diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java index b61696c1e..fc58db0b2 100755 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/crypto/WxCryptUtilTest.java @@ -17,7 +17,7 @@ import static org.testng.Assert.*; @Test public class WxCryptUtilTest { - String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG"; + String encodingAesKey = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFE"; String token = "pamtest"; String timestamp = "1409304348"; String nonce = "xxxxxx"; diff --git a/weixin-java-common/src/test/resources/testng.xml b/weixin-java-common/src/test/resources/testng.xml index 9eeba0df4..a5c082f03 100644 --- a/weixin-java-common/src/test/resources/testng.xml +++ b/weixin-java-common/src/test/resources/testng.xml @@ -4,7 +4,7 @@ - + diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml index 4fe6759f5..d80199544 100644 --- a/weixin-java-cp/pom.xml +++ b/weixin-java-cp/pom.xml @@ -127,21 +127,37 @@ src/test/resources/testng.xml - - --add-opens java.base/java.lang=ALL-UNNAMED - --add-opens java.base/java.lang.reflect=ALL-UNNAMED - --add-opens java.base/java.io=ALL-UNNAMED - --add-opens java.base/java.security=ALL-UNNAMED - --add-opens java.base/java.util=ALL-UNNAMED - --add-opens java.management/javax.management=ALL-UNNAMED - --add-opens java.naming/javax.naming=ALL-UNNAMED - + + test-jdk9-opens + + [9,) + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.lang.reflect=ALL-UNNAMED + --add-opens java.base/java.io=ALL-UNNAMED + --add-opens java.base/java.security=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.management/javax.management=ALL-UNNAMED + --add-opens java.naming/javax.naming=ALL-UNNAMED + + + + + + native-image diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java index c25b5208f..9a8009d68 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java @@ -545,8 +545,12 @@ public class WxCpMessage implements Serializable { articleJson.addProperty("description", article.getDescription()); articleJson.addProperty("url", article.getUrl()); articleJson.addProperty("picurl", article.getPicUrl()); - articleJson.addProperty("appid", article.getAppid()); - articleJson.addProperty("pagepath", article.getPagepath()); + if (StringUtils.isNotBlank(article.getAppid())) { + articleJson.addProperty("appid", article.getAppid()); + } + if (StringUtils.isNotBlank(article.getPagepath())) { + articleJson.addProperty("pagepath", article.getPagepath()); + } articleJsonArray.add(articleJson); } newsJsonObject.add("articles", articleJsonArray); @@ -619,7 +623,9 @@ public class WxCpMessage implements Serializable { if (StringUtils.isNotBlank(this.getSourceDesc())) { source.addProperty("desc", this.getSourceDesc()); } - source.addProperty("desc_color", this.getSourceDescColor()); + if (this.getSourceDescColor() != null) { + source.addProperty("desc_color", this.getSourceDescColor()); + } template.add("source", source); } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java index bbb6b7390..3e2b57dac 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java @@ -59,7 +59,9 @@ public class TemplateCardButton implements Serializable { btnObject.addProperty("style", this.getStyle()); } btnObject.addProperty("key", this.getKey()); - btnObject.addProperty("type", this.getType()); + if (this.getType() != 0) { + btnObject.addProperty("type", this.getType()); + } if (null != this.getUrl()) { btnObject.addProperty("url", this.getUrl()); } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java index 7acbc9dd2..bf675d7ea 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpBusyRetryTest.java @@ -1,6 +1,6 @@ package me.chanjar.weixin.cp.api; -import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxRuntimeException; import me.chanjar.weixin.common.util.http.RequestExecutor; @@ -12,76 +12,66 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.Assert.expectThrows; /** - * The type Wx cp busy retry test. + * 企业微信系统繁忙重试测试。 */ -@Test -@Slf4j public class WxCpBusyRetryTest { - /** - * Get service object [ ] [ ]. - * - * @return the object [ ] [ ] - */ @DataProvider(name = "getService") public Object[][] getService() { - WxCpService service = new WxCpServiceImpl() { - - @Override - public synchronized T executeInternal( - RequestExecutor executor, String uri, E data, boolean doNotAutoRefresh) - throws WxErrorException { - log.info("Executed"); - throw new WxErrorException("something"); - } - }; - + BusyService service = new BusyService(); service.setMaxRetryTimes(3); - service.setRetrySleepMillis(500); - return new Object[][]{ - new Object[]{service} - }; + service.setRetrySleepMillis(1); + return new Object[][]{{service}}; } /** - * Test retry. - * - * @param service the service - * @throws WxErrorException the wx error exception - */ - @Test(dataProvider = "getService", expectedExceptions = RuntimeException.class) - public void testRetry(WxCpService service) throws WxErrorException { - service.execute(null, null, null); - } - - /** - * Test retry in thread pool. - * - * @param service the service - * @throws InterruptedException the interrupted exception - * @throws ExecutionException the execution exception + * @param service 始终返回系统繁忙错误的服务 */ @Test(dataProvider = "getService") - public void testRetryInThreadPool(final WxCpService service) throws InterruptedException, ExecutionException { - // 当线程池中的线程复用的时候,还是能保证相同的重试次数 - ExecutorService executorService = Executors.newFixedThreadPool(1); - Runnable runnable = () -> { - try { - System.out.println("====================="); - System.out.println(Thread.currentThread().getName() + ": testRetry"); - service.execute(null, null, null); - } catch (WxErrorException e) { - throw new WxRuntimeException(e); - } catch (RuntimeException e) { - // OK - } - }; - Future submit1 = executorService.submit(runnable); - Future submit2 = executorService.submit(runnable); - - submit1.get(); - submit2.get(); + public void testRetry(WxCpService service) { + assertRetryExhausted(service); + assertEquals(((BusyService) service).calls.get(), 4); } + /** + * @param service 始终返回系统繁忙错误的服务 + * @throws InterruptedException 等待任务被中断 + * @throws ExecutionException 后台测试失败 + */ + @Test(dataProvider = "getService") + public void testRetryInThreadPool(WxCpService service) throws InterruptedException, ExecutionException { + ExecutorService executorService = Executors.newFixedThreadPool(1); + try { + Future first = executorService.submit(() -> assertRetryExhausted(service)); + Future second = executorService.submit(() -> assertRetryExhausted(service)); + first.get(); + second.get(); + assertEquals(((BusyService) service).calls.get(), 8); + } finally { + executorService.shutdownNow(); + } + } + + private void assertRetryExhausted(WxCpService service) { + WxRuntimeException failure = expectThrows(WxRuntimeException.class, + () -> service.execute(null, (String) null, null)); + assertTrue(failure.getMessage().contains("超出重试次数")); + } + + private static class BusyService extends WxCpServiceImpl { + private final AtomicInteger calls = new AtomicInteger(); + + @Override + public synchronized T executeInternal(RequestExecutor executor, String uri, E data, + boolean doNotAutoRefresh) throws WxErrorException { + calls.incrementAndGet(); + throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("system busy").build()); + } + } } diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java index 53a55aeaf..79b4e4e38 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/WxCpMessageRouterTest.java @@ -5,6 +5,7 @@ import me.chanjar.weixin.common.session.StandardSessionManager; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; +import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl; import me.chanjar.weixin.cp.message.WxCpMessageHandler; import me.chanjar.weixin.cp.message.WxCpMessageMatcher; import me.chanjar.weixin.cp.message.WxCpMessageRouter; @@ -31,6 +32,7 @@ public class WxCpMessageRouterTest { */ @Test(enabled = false) public void prepare(boolean async, StringBuffer sb, WxCpMessageRouter router) { + router.setMessageDuplicateChecker(new me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker()); router .rule() .async(async) @@ -72,7 +74,7 @@ public class WxCpMessageRouterTest { @Test(dataProvider = "messages-1") public void testSync(WxCpXmlMessage message, String expected) { StringBuffer sb = new StringBuffer(); - WxCpMessageRouter router = new WxCpMessageRouter(null); + WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); prepare(false, sb, router); router.route(message); Assert.assertEquals(sb.toString(), expected); @@ -88,7 +90,7 @@ public class WxCpMessageRouterTest { @Test(dataProvider = "messages-1") public void testAsync(WxCpXmlMessage message, String expected) throws InterruptedException { StringBuffer sb = new StringBuffer(); - WxCpMessageRouter router = new WxCpMessageRouter(null); + WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); prepare(true, sb, router); router.route(message); Thread.sleep(500); @@ -101,7 +103,7 @@ public class WxCpMessageRouterTest { * @throws InterruptedException the interrupted exception */ public void testConcurrency() throws InterruptedException { - final WxCpMessageRouter router = new WxCpMessageRouter(null); + final WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); router.rule().handler(new WxCpMessageHandler() { @Override public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, @@ -214,7 +216,7 @@ public class WxCpMessageRouterTest { public void testSessionClean1(StandardSessionManager ism) throws InterruptedException { // 两个同步请求,看是否处理完毕后会被清理掉 - final WxCpMessageRouter router = new WxCpMessageRouter(null); + final WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); router.setSessionManager(ism); router .rule().async(false).handler(new WxSessionMessageHandler()).next() @@ -240,7 +242,7 @@ public class WxCpMessageRouterTest { // 1个同步,1个异步请求,看是否处理完毕后会被清理掉 { - final WxCpMessageRouter router = new WxCpMessageRouter(null); + final WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); router.setSessionManager(ism); router .rule().async(false).handler(new WxSessionMessageHandler()).next() @@ -254,7 +256,7 @@ public class WxCpMessageRouterTest { Assert.assertEquals(ism.getActiveSessions(), 0); } { - final WxCpMessageRouter router = new WxCpMessageRouter(null); + final WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); router.setSessionManager(ism); router .rule().async(true).handler(new WxSessionMessageHandler()).next() @@ -280,7 +282,7 @@ public class WxCpMessageRouterTest { public void testSessionClean3(StandardSessionManager ism) throws InterruptedException { // 2个异步请求,看是否处理完毕后会被清理掉 - final WxCpMessageRouter router = new WxCpMessageRouter(null); + final WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); router.setSessionManager(ism); router .rule().async(true).handler(new WxSessionMessageHandler()).next() @@ -306,7 +308,7 @@ public class WxCpMessageRouterTest { // 一个同步请求,看是否处理完毕后会被清理掉 { - final WxCpMessageRouter router = new WxCpMessageRouter(null); + final WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); router.setSessionManager(ism); router .rule().async(false).handler(new WxSessionMessageHandler()).end(); @@ -320,7 +322,7 @@ public class WxCpMessageRouterTest { } { - final WxCpMessageRouter router = new WxCpMessageRouter(null); + final WxCpMessageRouter router = new WxCpMessageRouter(new WxCpServiceImpl()); router.setSessionManager(ism); router .rule().async(true).handler(new WxSessionMessageHandler()).end(); diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessageTest.java index e87ff2334..488694429 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessageTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpXmlMessageTest.java @@ -124,7 +124,7 @@ public class WxCpXmlMessageTest { assertEquals(wxMessage.getFromUserName(), "xiaohe"); assertEquals(wxMessage.getCreateTime(), Long.valueOf(1502012364L)); assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT); - assertEquals(wxMessage.getAgentId(), Integer.valueOf(1000004)); + assertEquals(wxMessage.getAgentId(), "1000004"); assertEquals(wxMessage.getEvent(), "pic_weixin"); assertEquals(wxMessage.getEventKey(), "faceSimilarity"); assertNotNull(wxMessage.getSendPicsInfo()); @@ -190,7 +190,7 @@ public class WxCpXmlMessageTest { assertEquals(wxMessage.getFromUserName(), "FromUser"); assertEquals(wxMessage.getCreateTime(), Long.valueOf(123456789L)); assertEquals(wxMessage.getMsgType(), WxConsts.XmlMsgType.EVENT); - assertEquals(wxMessage.getAgentId(), Integer.valueOf(1)); + assertEquals(wxMessage.getAgentId(), "1"); assertEquals(wxMessage.getEvent(), TASKCARD_CLICK); assertEquals(wxMessage.getEventKey(), "key111"); assertEquals(wxMessage.getTaskId(), "taskid111"); diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java index b446bda58..05bafe959 100644 --- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java +++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/tp/service/impl/WxCpTpTagServiceImplTest.java @@ -86,7 +86,7 @@ public class WxCpTpTagServiceImplTest { String url = configStorage.getApiUrl(TAG_LIST); String result = "{\"errcode\":0,\"errmsg\":\"ok\",\"taglist\":[{\"tagid\":1,\"tagname\":\"a\"},{\"tagid\":2," + "\"tagname\":\"b\"}]}"; - when(wxCpTpService.get(eq(url), anyString())).thenReturn(result); + when(wxCpTpService.get(eq(url), isNull())).thenReturn(result); List wxCpTpTags = wxCpTpTagService.listAll(); assertNotNull(wxCpTpTags); @@ -106,7 +106,7 @@ public class WxCpTpTagServiceImplTest { String url = String.format(configStorage.getApiUrl(TAG_GET), tagId); String result = "{\"errcode\":0,\"errmsg\":\"ok\",\"tagname\":\"乒乓球协会\",\"userlist\":[{\"userid\":\"zhangsan\"," + "\"name\":\"李四\"}],\"partylist\":[2]}"; - when(wxCpTpService.get(eq(url), anyString())).thenReturn(result); + when(wxCpTpService.get(eq(url), isNull())).thenReturn(result); WxCpTpTagGetResult getResult = wxCpTpTagService.get(tagId); assertEquals(getResult.getTagname(), "乒乓球协会"); diff --git a/weixin-java-cp/src/test/resources/testng.xml b/weixin-java-cp/src/test/resources/testng.xml index ed49a2da0..6e586686f 100644 --- a/weixin-java-cp/src/test/resources/testng.xml +++ b/weixin-java-cp/src/test/resources/testng.xml @@ -4,14 +4,11 @@ - - - @@ -26,7 +23,6 @@ - diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java index 601c18743..4e869c397 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java @@ -22,6 +22,8 @@ import java.util.List; public class ArticleUrlResult implements Serializable { @XStreamAlias("ResultList") + @XStreamConverter(value = com.thoughtworks.xstream.converters.extended.NamedCollectionConverter.class, + strings = "item", types = Item.class, useImplicitType = false) @JacksonXmlProperty(localName = "ResultList") private List resultList; diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/SendPicsInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/SendPicsInfo.java index c5533328c..636e7cdb9 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/SendPicsInfo.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/SendPicsInfo.java @@ -27,6 +27,8 @@ public class SendPicsInfo implements Serializable { private static final long serialVersionUID = -4572837013294199227L; @XStreamAlias("PicList") + @XStreamConverter(value = com.thoughtworks.xstream.converters.extended.NamedCollectionConverter.class, + strings = "item", types = Item.class, useImplicitType = false) @JacksonXmlProperty(localName = "PicList") protected final List picList = new ArrayList<>(); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBusyRetryTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBusyRetryTest.java index 6e29d0c64..69ce2cd00 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBusyRetryTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpBusyRetryTest.java @@ -26,12 +26,13 @@ public class WxMpBusyRetryTest { RequestExecutor executor, String uri, E data, boolean doNotAutoRefresh) throws WxErrorException { log.info("Executed"); - throw new WxErrorException("something"); + throw new WxErrorException(me.chanjar.weixin.common.error.WxError.builder() + .errorCode(-1).errorMsg("system busy").build()); } }; service.setMaxRetryTimes(3); - service.setRetrySleepMillis(500); + service.setRetrySleepMillis(1); return new Object[][]{{service}}; } @@ -52,7 +53,7 @@ public class WxMpBusyRetryTest { } catch (WxErrorException e) { throw new WxRuntimeException(e); } catch (RuntimeException e) { - // OK + org.testng.Assert.assertTrue(e.getMessage().contains("超出重试次数")); } }; Future submit1 = executorService.submit(runnable); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java index c9df2c815..fcbeb91c6 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpJsAPITest.java @@ -1,10 +1,7 @@ package me.chanjar.weixin.mp.api; -import com.google.inject.Inject; import me.chanjar.weixin.common.util.crypto.SHA1; -import me.chanjar.weixin.mp.api.test.ApiTestModule; import org.testng.Assert; -import org.testng.annotations.Guice; import org.testng.annotations.Test; /** @@ -13,12 +10,8 @@ import org.testng.annotations.Test; * @author chanjarster */ @Test -@Guice(modules = ApiTestModule.class) public class WxMpJsAPITest { - @Inject - protected WxMpService wxService; - public void test() { long timestamp = 1419835025L; String url = "http://omstest.vmall.com:23568/thirdparty/wechat/vcode/gotoshare?quantity=1&batchName=MATE7"; diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java index 93f47a70f..92a5f4d67 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/WxMpMessageRouterTest.java @@ -1,6 +1,9 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.api.WxConsts; +import me.chanjar.weixin.common.api.WxMessageInMemoryDuplicateChecker; +import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; +import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; import me.chanjar.weixin.common.session.StandardSessionManager; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; @@ -20,8 +23,17 @@ import java.util.Map; @Test public class WxMpMessageRouterTest { + private WxMpService newTestService() { + WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl(); + config.setAppId("test-app-id"); + WxMpService service = new WxMpServiceImpl(); + service.setWxMpConfigStorage(config); + return service; + } + @Test(enabled = false) public void prepare(boolean async, StringBuffer sb, WxMpMessageRouter router) { + router.setMessageDuplicateChecker(new WxMessageInMemoryDuplicateChecker()); router .rule() .async(async) @@ -56,7 +68,7 @@ public class WxMpMessageRouterTest { @Test(dataProvider = "messages-1") public void testSync(WxMpXmlMessage message, String expected) { StringBuffer sb = new StringBuffer(); - WxMpMessageRouter router = new WxMpMessageRouter(null); + WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); prepare(false, sb, router); router.route(message); Assert.assertEquals(sb.toString(), expected); @@ -65,7 +77,7 @@ public class WxMpMessageRouterTest { @Test(dataProvider = "messages-1") public void testAsync(WxMpXmlMessage message, String expected) throws InterruptedException { StringBuffer sb = new StringBuffer(); - WxMpMessageRouter router = new WxMpMessageRouter(null); + WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); prepare(true, sb, router); router.route(message); Thread.sleep(500); @@ -77,7 +89,7 @@ public class WxMpMessageRouterTest { public void testExternalExcutorService(WxMpXmlMessage message, String expected) throws InterruptedException { StringBuffer sb = new StringBuffer(); ExecutorService executorService = Executors.newFixedThreadPool(100); - WxMpMessageRouter router = new WxMpMessageRouter(null, executorService); + WxMpMessageRouter router = new WxMpMessageRouter(newTestService(), executorService); prepare(true, sb, router); router.route(message); Thread.sleep(500); @@ -87,7 +99,7 @@ public class WxMpMessageRouterTest { public void testConcurrency() throws InterruptedException { - final WxMpMessageRouter router = new WxMpMessageRouter(null); + final WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); router.rule().handler(new WxMpMessageHandler() { @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, @@ -183,7 +195,7 @@ public class WxMpMessageRouterTest { public void testSessionClean1(StandardSessionManager ism) throws InterruptedException { // 两个同步请求,看是否处理完毕后会被清理掉 - final WxMpMessageRouter router = new WxMpMessageRouter(null); + final WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); router.setSessionManager(ism); router .rule().async(false).handler(new WxSessionMessageHandler()).next() @@ -203,7 +215,7 @@ public class WxMpMessageRouterTest { // 1个同步,1个异步请求,看是否处理完毕后会被清理掉 { - final WxMpMessageRouter router = new WxMpMessageRouter(null); + final WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); router.setSessionManager(ism); router .rule().async(false).handler(new WxSessionMessageHandler()).next() @@ -217,7 +229,7 @@ public class WxMpMessageRouterTest { Assert.assertEquals(ism.getActiveSessions(), 0); } { - final WxMpMessageRouter router = new WxMpMessageRouter(null); + final WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); router.setSessionManager(ism); router .rule().async(true).handler(new WxSessionMessageHandler()).next() @@ -237,7 +249,7 @@ public class WxMpMessageRouterTest { public void testSessionClean3(StandardSessionManager ism) throws InterruptedException { // 2个异步请求,看是否处理完毕后会被清理掉 - final WxMpMessageRouter router = new WxMpMessageRouter(null); + final WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); router.setSessionManager(ism); router .rule().async(true).handler(new WxSessionMessageHandler()).next() @@ -257,7 +269,7 @@ public class WxMpMessageRouterTest { // 一个同步请求,看是否处理完毕后会被清理掉 { - final WxMpMessageRouter router = new WxMpMessageRouter(null); + final WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); router.setSessionManager(ism); router .rule().async(false).handler(new WxSessionMessageHandler()).end(); @@ -271,7 +283,7 @@ public class WxMpMessageRouterTest { } { - final WxMpMessageRouter router = new WxMpMessageRouter(null); + final WxMpMessageRouter router = new WxMpMessageRouter(newTestService()); router.setSessionManager(ism); router .rule().async(true).handler(new WxSessionMessageHandler()).end(); diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlItemTypesTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlItemTypesTest.java new file mode 100644 index 000000000..de02acf9c --- /dev/null +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlItemTypesTest.java @@ -0,0 +1,21 @@ +package me.chanjar.weixin.mp.bean.message; + +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; + +public class WxMpXmlItemTypesTest { + @Test + public void testItemsUseTheirContainingListType() { + WxMpXmlMessage message = WxMpXmlMessage.fromXml("" + + "1picture-md5" + + "" + + "11" + + "https://example.com/article" + + ""); + assertEquals(message.getSendPicsInfo().getPicList().get(0).getPicMd5Sum(), "picture-md5"); + assertEquals(message.getArticleUrlResult().getResultList().get(0).getArticleIdx(), "1"); + assertEquals(message.getArticleUrlResult().getResultList().get(0).getArticleUrl(), + "https://example.com/article"); + } +} diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessageTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessageTest.java index 26eb06a2b..bb058d14a 100644 --- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessageTest.java +++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/bean/message/WxMpXmlOutNewsMessageTest.java @@ -24,7 +24,6 @@ public class WxMpXmlOutNewsMessageTest { + "" + "1122" + "" - + " 2" + " " + " " + " <![CDATA[title]]>" @@ -39,6 +38,7 @@ public class WxMpXmlOutNewsMessageTest { + " " + " " + " " + + " 2" + ""; System.out.println(m.toXml()); Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); diff --git a/weixin-java-mp/src/test/resources/testng.xml b/weixin-java-mp/src/test/resources/testng.xml index ea264e671..25fce709d 100644 --- a/weixin-java-mp/src/test/resources/testng.xml +++ b/weixin-java-mp/src/test/resources/testng.xml @@ -4,14 +4,8 @@ - - - - - - @@ -19,6 +13,7 @@ + diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml index cc1f84b59..9bcc08284 100644 --- a/weixin-java-pay/pom.xml +++ b/weixin-java-pay/pom.xml @@ -95,6 +95,20 @@ + + + + org.apache.maven.plugins + maven-surefire-plugin + + + src/test/resources/testng.xml + + + + + + native-image diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/config/WxPayConfigPrivateKeyTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/config/WxPayConfigPrivateKeyTest.java index 927e0c412..4c0ec0a70 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/config/WxPayConfigPrivateKeyTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/config/WxPayConfigPrivateKeyTest.java @@ -11,47 +11,23 @@ import static org.testng.Assert.*; public class WxPayConfigPrivateKeyTest { @Test - public void testPrivateKeyStringFormat_PemFormat() { + public void testPrivateKeyStringFormat_PemFormat() throws Exception { + java.security.KeyPairGenerator generator = java.security.KeyPairGenerator.getInstance("RSA"); + generator.initialize(2048); + java.security.KeyPair pair = generator.generateKeyPair(); + java.util.Base64.Encoder encoder = java.util.Base64.getMimeEncoder(64, new byte[]{'\n'}); WxPayConfig config = new WxPayConfig(); - - // Set minimal required configuration config.setMchId("1234567890"); config.setApiV3Key("test-api-v3-key-32-characters-long"); config.setCertSerialNo("test-serial-number"); - - // Test with PEM format private key string that would previously fail - String pemKey = "-----BEGIN PRIVATE KEY-----\n" + - "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC2pK3buBufh8Vo\n" + - "X4sfYbZ5CcPeGMnVQTGmj0b6\n" + - "-----END PRIVATE KEY-----"; - - config.setPrivateKeyString(pemKey); - - // This should not throw a "无效的密钥格式" exception immediately - // The actual key validation will happen during HTTP client initialization - // but at least the format parsing should not fail - - try { - // Try to initialize API V3 HTTP client - this might fail for other reasons - // (like invalid key content) but should not fail due to format parsing - config.initApiV3HttpClient(); - // If we get here without InvalidKeySpecException, the format detection worked - } catch (WxPayException e) { - // Check that it's not the specific "无效的密钥格式" error from PemUtils - if (e.getCause() != null && - e.getCause().getMessage() != null && - e.getCause().getMessage().contains("无效的密钥格式")) { - fail("Private key format detection failed - PEM format was not handled correctly: " + e.getMessage()); - } - // Other exceptions are acceptable for this test since we're using a dummy key - } catch (Exception e) { - // Check for the specific InvalidKeySpecException that indicates format problems - if (e.getCause() != null && - e.getCause().getMessage() != null && - e.getCause().getMessage().contains("无效的密钥格式")) { - fail("Private key format detection failed - PEM format was not handled correctly: " + e.getMessage()); - } - // Other exceptions are acceptable for this test since we're using a dummy key + config.setPrivateKeyString("-----BEGIN PRIVATE KEY-----\n" + + encoder.encodeToString(pair.getPrivate().getEncoded()) + "\n-----END PRIVATE KEY-----"); + config.setFullPublicKeyModel(true); + config.setPublicKeyId("PUB_KEY_ID_TEST"); + config.setPublicKeyString("-----BEGIN PUBLIC KEY-----\n" + + encoder.encodeToString(pair.getPublic().getEncoded()) + "\n-----END PUBLIC KEY-----"); + try (org.apache.http.impl.client.CloseableHttpClient client = config.initApiV3HttpClient()) { + assertNotNull(client); } } @@ -113,4 +89,4 @@ public class WxPayConfigPrivateKeyTest { // Other exceptions are acceptable for this test since we're using a dummy cert } } -} \ No newline at end of file +} diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifierPublicKeyModeTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifierPublicKeyModeTest.java index e60f5eac1..5275fd0ed 100644 --- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifierPublicKeyModeTest.java +++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/v3/auth/AutoUpdateCertificatesVerifierPublicKeyModeTest.java @@ -22,16 +22,18 @@ public class AutoUpdateCertificatesVerifierPublicKeyModeTest { private WxPayCredentials credentials; @BeforeMethod - public void setUp() { + public void setUp() throws Exception { // 使用无效的配置,模拟证书下载失败的场景 invalidMchId = "invalid_mch_id"; invalidApiV3Key = "invalid_api_v3_key_must_be_32_b"; invalidCertSerialNo = "invalid_serial_no"; payBaseUrl = "https://api.mch.weixin.qq.com"; + java.security.KeyPairGenerator generator = java.security.KeyPairGenerator.getInstance("RSA"); + generator.initialize(2048); credentials = new WxPayCredentials( invalidMchId, - new PrivateKeySigner(invalidCertSerialNo, null) + new PrivateKeySigner(invalidCertSerialNo, generator.generateKeyPair().getPrivate()) ); } @@ -48,7 +50,14 @@ public class AutoUpdateCertificatesVerifierPublicKeyModeTest { 60, payBaseUrl, null - ); + ) { + @Override + public void customHttpClientBuilder(com.github.binarywang.wxpay.v3.WxPayV3HttpClientBuilder builder) { + builder.addInterceptorFirst((org.apache.http.HttpRequestInterceptor) (request, context) -> { + throw new java.io.IOException("simulated certificate download failure"); + }); + } + }; // 如果没有抛出异常,测试通过 assertNotNull(verifier); } @@ -64,7 +73,14 @@ public class AutoUpdateCertificatesVerifierPublicKeyModeTest { 60, payBaseUrl, null - ); + ) { + @Override + public void customHttpClientBuilder(com.github.binarywang.wxpay.v3.WxPayV3HttpClientBuilder builder) { + builder.addInterceptorFirst((org.apache.http.HttpRequestInterceptor) (request, context) -> { + throw new java.io.IOException("simulated certificate download failure"); + }); + } + }; // verify 方法应该返回 false,而不是抛出异常 boolean result = verifier.verify("test_serial", "test_message".getBytes(), "test_signature"); @@ -83,7 +99,14 @@ public class AutoUpdateCertificatesVerifierPublicKeyModeTest { 60, payBaseUrl, null - ); + ) { + @Override + public void customHttpClientBuilder(com.github.binarywang.wxpay.v3.WxPayV3HttpClientBuilder builder) { + builder.addInterceptorFirst((org.apache.http.HttpRequestInterceptor) (request, context) -> { + throw new java.io.IOException("simulated certificate download failure"); + }); + } + }; // 应该抛出有意义的异常 X509Certificate certificate = verifier.getValidCertificate(); diff --git a/weixin-java-pay/src/test/resources/testng.xml b/weixin-java-pay/src/test/resources/testng.xml new file mode 100644 index 000000000..180aa0821 --- /dev/null +++ b/weixin-java-pay/src/test/resources/testng.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/WxMpBusyRetryTest.java b/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/WxMpBusyRetryTest.java index 090dd893d..016e76f3b 100644 --- a/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/WxMpBusyRetryTest.java +++ b/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/WxMpBusyRetryTest.java @@ -25,12 +25,13 @@ public class WxMpBusyRetryTest { RequestExecutor executor, String uri, E data) throws WxErrorException { log.info("Executed"); - throw new WxErrorException("something"); + throw new WxErrorException(me.chanjar.weixin.common.error.WxError.builder() + .errorCode(-1).errorMsg("system busy").build()); } }; service.setMaxRetryTimes(3); - service.setRetrySleepMillis(500); + service.setRetrySleepMillis(1); return new Object[][]{{service}}; } @@ -51,7 +52,7 @@ public class WxMpBusyRetryTest { } catch (WxErrorException e) { throw new WxRuntimeException(e); } catch (RuntimeException e) { - // OK + org.testng.Assert.assertTrue(e.getMessage().contains("超出重试次数")); } }; Future submit1 = executorService.submit(runnable); diff --git a/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/WxMpJsAPITest.java b/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/WxMpJsAPITest.java index 7c84e7833..0356e6496 100644 --- a/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/WxMpJsAPITest.java +++ b/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/WxMpJsAPITest.java @@ -1,10 +1,7 @@ package me.chanjar.weixin.qidian.api; -import com.google.inject.Inject; import me.chanjar.weixin.common.util.crypto.SHA1; -import me.chanjar.weixin.qidian.api.test.ApiTestModule; import org.testng.Assert; -import org.testng.annotations.Guice; import org.testng.annotations.Test; /** @@ -13,12 +10,8 @@ import org.testng.annotations.Test; * @author chanjarster */ @Test -@Guice(modules = ApiTestModule.class) public class WxMpJsAPITest { - @Inject - protected WxQidianService wxService; - public void test() { long timestamp = 1419835025L; String url = "http://omstest.vmall.com:23568/thirdparty/wechat/vcode/gotoshare?quantity=1&batchName=MATE7"; diff --git a/weixin-java-qidian/src/test/resources/testng.xml b/weixin-java-qidian/src/test/resources/testng.xml index 4690a4cad..89796e197 100644 --- a/weixin-java-qidian/src/test/resources/testng.xml +++ b/weixin-java-qidian/src/test/resources/testng.xml @@ -4,27 +4,7 @@ - - - - - - - - - - - - - - - - - - - -