From 7ee9cc866e5b4bfdb8d03a033ce9dd29cdee6835 Mon Sep 17 00:00:00 2001 From: lili Date: Thu, 25 Jun 2026 22:37:50 -0700 Subject: [PATCH] =?UTF-8?q?test(knowledge):=20=E8=A1=A5=20MuseKnowledgeBin?= =?UTF-8?q?dingServiceTest=20=E6=BC=8F=E7=9A=84=20@Mock=20MarketHandoffTok?= =?UTF-8?q?enApi(=E4=BF=AE=E9=A2=84=E5=AD=98=20NPE=20=E7=BA=A2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 回归验证(本 session 改动确认)顺带发现的预存历史红(非本 session 引入、真实 CI 隐患):should_createMarketBindingPrecheckWithRedactedHandoffHashAndRfc3339Expiry 因测试类漏声明 MarketHandoffTokenApi 的 @Mock→@InjectMocks 注入 null→service consumeMarketHandoff 调 marketHandoffTokenApi.verify(:275)抛 NPE。该红源于 Market handoff 特性(e5d2b52/3a7a72f、6-19)补 verify/consume 真验真核销时,测试 mock 装配未跟上。 补 @Mock + 该用例 stub verify(valid=true)让 market_kb 兑现路径通过,聚焦原 precheck handoff hash 脱敏/RFC3339 过期断言不变。验证:MuseKnowledgeBindingServiceTest 11/11 全绿 BUILD SUCCESS(此前 :71 NPE 红、其他 10 用例不破坏)。 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../application/muse/MuseKnowledgeBindingServiceTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/MuseKnowledgeBindingServiceTest.java b/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/MuseKnowledgeBindingServiceTest.java index 67b0e3b6..4dc02688 100644 --- a/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/MuseKnowledgeBindingServiceTest.java +++ b/muse-cloud/muse-module-knowledge/muse-module-knowledge-server/src/test/java/cn/iocoder/muse/module/knowledge/application/muse/MuseKnowledgeBindingServiceTest.java @@ -12,6 +12,8 @@ import cn.iocoder.muse.module.knowledge.dal.dataobject.muse.MuseKnowledgeSourceB import cn.iocoder.muse.module.knowledge.dal.mysql.muse.MuseKnowledgeBindPrecheckMapper; import cn.iocoder.muse.module.knowledge.dal.mysql.muse.MuseKnowledgeBindingMapper; import cn.iocoder.muse.module.knowledge.dal.mysql.muse.MuseKnowledgeSourceBindingProjectionMapper; +import cn.iocoder.muse.module.market.api.handoff.MarketHandoffTokenApi; +import cn.iocoder.muse.module.market.api.handoff.dto.HandoffVerifyRespDTO; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; @@ -61,6 +63,8 @@ class MuseKnowledgeBindingServiceTest extends BaseMockitoUnitTest { private MuseKnowledgeCommandService commandService; @Mock private MuseKnowledgeWorkOwnerFacade workOwnerFacade; + @Mock + private MarketHandoffTokenApi marketHandoffTokenApi; @AfterEach void clearTenantContext() { @@ -76,6 +80,10 @@ class MuseKnowledgeBindingServiceTest extends BaseMockitoUnitTest { AppKnowledgeBindingVO.PrecheckReqVO reqVO = precheckReq("market_kb", "available", List.of("search", "generate", "export")); reqVO.setHandoffToken("market-secret-token"); + // market_kb 来源会回 Market 服务端核验 handoff token(consumeMarketHandoff→verify);桩返回 valid=true 让兑现通过, + // 本用例聚焦 precheck 的 handoff hash 脱敏与 RFC3339 过期断言。 + when(marketHandoffTokenApi.verify(any())).thenReturn( + new HandoffVerifyRespDTO(true, "verified", "knowledge", "bind", null, null, null, null, null)); AppKnowledgeBindingVO.PrecheckRespVO respVO = bindingService.createKnowledgeBindingPrecheck(2001L, "1", 9001L, reqVO);