浏览代码

fix(进件): Task 5 修复轮 2 - 五处注释/事实陈述订正

只改注释,无生产行为、无断言、无测试结构变更;LeshouyingResponseParser.java 本体未动。

- R32-1 areaList_itemJsonNull_isJavaNull_notStringNull 的 javadoc:删掉「改解析器会动到
  Task 1-4 与批次一全部路径」这条失实的成本依据(派发文件 §五第 3 条已勘误:toMap 逐键替换
  顶层值,递归化不改任何顶层键的值,只读顶层键的既有消费方读到的东西不变)。禁令本身保留,
  但不再自带理由;真实作用面与重新评估条件改为只指向 LsyOnboardingService#toShopItems 的
  javadoc,本处不复述。
- R32-2 LsyOnboardingService#toShopItems 的 javadoc:把「main 里出现 JSONObject/JSONArray
  的地方只有解析器自己」按裁定收窄到本模块 main,不枚举其他模块。★ 收窄后仍然字面为假:
  实测本模块 main 里提及这两个类名的有**两个**文件(解析器 3 处;本类 4 处,全在本段 javadoc
  里,本句自己就是一处)。故再精确一步,改说「本模块 main 里把这两个类名写进代码的只有
  解析器自己(javadoc 里的提及不算)」。跨模块读数(按裁定未写进 javadoc):全仓 main 共
  5 个文件提及,另有 monitor/OnlineService、payment/enterprise/AlipayEnterpriseService、
  system/auth/AuthService。
- R32-3 LeshouyingResponseParserTest:把「LeshouyingResponseParser.java:117」这个行号引用
  换成内容锚点(段落首「【边界:只归一层顶层,不递归】」、末「先回来把这里改成递归」),
  行号会漂,段落特征词不会。
- R32-4 同处:把「当前所有消费方(Task 6 payPatch、Task 12 回调)只读顶层字段,所以够用」
  订正为真实理由 —— 读嵌套字段的消费方(areaList / listShops)都自己过了 asText 归一,
  与紧邻的「下次动 toMap 就一并递归化」触发条件不冲突。
- R32-5 createShop_blankRequiredField_throws400 的 javadoc:订正「verifyNoInteractions 的
  前提就是这条用例没打过桩」——该断言的前提只是「这个 mock 上零交互」,打桩本身不算交互;
  并补上误诊路径(严格桩检查的红落在扩展收尾阶段,此时测试体已跑完、断言早已通过)。
alphaH 3 周之前
父节点
当前提交
cf7d5377ac

+ 2 - 1
java/src/main/java/com/payment/platform/module/payment/leshouying/service/LsyOnboardingService.java

@@ -359,7 +359,8 @@ public class LsyOnboardingService {
      *       (唯一会变的形态是把整张已解析的 map 原样序列化或打印 —— 本模块没有这种用法。)</li>
      *   <li>全模块读嵌套字段的只有两个方法({@link #toAreaItems} 与本方法):4 个
      *       {@code instanceof Map/List} 守卫 + 6 个元素字段读取,**全部**过 {@code asText};
-     *       main 里出现 {@code JSONObject}/{@code JSONArray} 的地方只有解析器自己。</li>
+     *       本模块 main 里把这两个类名写进**代码**的只有解析器自己
+     *       (javadoc 里的提及不算,本句就是一处)。</li>
      *   <li>递归化后这两处守卫照样成立:{@code JSONObject} 经 {@code MapWrapper} 实现 {@code Map}、
      *       {@code JSONArray} 直接实现 {@code java.util.List}(javap hutool-all 5.8.34 实测)
      *       ⇒ 容器仍是 List、元素仍是 Map;变成死代码的只有 {@link #asText} 的 {@code JSONNull} 分支。</li>

+ 4 - 2
java/src/test/java/com/payment/platform/module/payment/leshouying/client/LeshouyingResponseParserTest.java

@@ -112,9 +112,11 @@ class LeshouyingResponseParserTest {
         // ★ 这条是**给未来的读者的警告**,同时钉住当前的真实边界:归一化只走顶层
         //   (实现对 `obj.keySet()` 逐键替换,不递归)。
         //   实测(NullProbe):嵌套对象仍是 `JSONObject`,其内部取出的 null 仍是 `JSONNull`。
-        //   当前所有消费方(Task 6 payPatch、Task 12 回调)只读顶层字段,所以够用;
+        //   当前**读嵌套字段的消费方**(LsyOnboardingService 的 areaList / listShops)都自己过了
+        //   asText 把 JSONNull 归成 Java null,所以够用;
         //   但**别以为这是递归的** —— 源码里那句是「谁要开始读嵌套字段,先回来把这里改成递归」
-        //   (LeshouyingResponseParser.java:117,逐字)。
+        //   (逐字引自 LeshouyingResponseParser.toMap 里那段以「【边界:只归一层顶层,不递归】」
+        //   开头、以「先回来把这里改成递归」收尾的注释)。
         //   ★ 谁下次动 toMap,就把递归化一并做掉:作用面(实测)与决定依据见
         //   LsyOnboardingService#toShopItems 的 javadoc —— 那里正是被这条注释点名、
         //   却先走了「读取点归一」的那处,它记着为什么以及什么时候翻回来。

+ 8 - 6
java/src/test/java/com/payment/platform/module/payment/leshouying/service/LsyOnboardingServiceTest.java

@@ -229,9 +229,9 @@ class LsyOnboardingServiceTest {
      * <p>{@link LeshouyingResponseParser} 的归一化**只走顶层**(不递归),这一点由它自己的
      * javadoc 与 {@code parseV3_normalization_isTopLevelOnly_nestedJsonNullSurvives} 钉住,
      * 那里还写着「谁要开始读嵌套字段,先回来把这里改成递归」—— 它只给了**改解析器**这一条路,
-     * 而本 task 的边界不允许改(会动到 Task 1-4 与批次一全部路径)。本类是全模块第一个读嵌套
-     * 字段的消费方,所以归一化补在读取处,重新评估的条件见
-     * {@code LsyOnboardingService#toShopItems} 的 javadoc:
+     * 而本 task 的边界不允许改。本类是全模块第一个读嵌套字段的消费方,所以归一化补在读取处;
+     * 那条路**真实的作用面与重新评估条件只在**
+     * {@code LsyOnboardingService#toShopItems} 的 javadoc 里写了一次,此处不复述:
      * {@code area_list[i].area_code} 的 JSON null 若按 {@code String.valueOf} 走,
      * 得到的是**字符串** {@code "null"}(实测,见解析器 javadoc),
      * 那会被当成一个真实的区划编码继续传给上游(三级联动的下一跳 parent_code)。
@@ -637,10 +637,12 @@ class LsyOnboardingServiceTest {
      * + DTO 的五个。空白的三种形态({@code null} / 空串 / 全空格)逐个试,因为
      * 「漏了其中一个」正是这条要防的形态。
      *
-     * <p>★ 本用例**一次都不打桩**(整个方法里不出现 {@code stubUpstream}):
-     * {@code verifyNoInteractions} 的前提就是「这条用例没打过桩」。
+     * <p>★ 本用例**一次都不打桩**(整个方法里不出现 {@code stubUpstream})—— 这是本类的纪律,
+     * **不是** {@code verifyNoInteractions} 的前提:那条断言的前提只是「这个 mock 上零**交互**」,
+     * 而**打桩本身不算交互**(Mockito 的 invocation 列表里不记桩)。「只打桩、没真调用」不会让它红。
      * (Mockito 的严格桩检查会把「打了桩却没人用」也判成失败 —— 但那**不是**本断言,
-     * 两者不要混为一谈。)
+     * 两者不要混为一谈:那种红落在扩展收尾阶段,此时测试体已跑完、上面那行断言早已通过,
+     * 别顺着它的报错去怀疑 {@code verifyNoInteractions}。)
      */
     @Test
     void createShop_blankRequiredField_throws400() {