test(knowledge): 补 MuseKnowledgeBindingServiceTest 漏的 @Mock MarketHandoffTokenApi(修预存 NPE 红)

回归验证(本 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) <noreply@anthropic.com>
This commit is contained in:
lili 2026-06-25 22:37:50 -07:00
parent 85ad97798f
commit 7ee9cc866e

View File

@ -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(consumeMarketHandoffverify);桩返回 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);