记录一个测试时候遇到的System.StringException以及debug过程


记录一个测试时候遇到的System.StringException以及debug过程

前言

今天在跑Test Class时候遇到一个挺奇怪的BUG。之前100%覆盖的代码,突然有两三个case死活就是跑不过去了。

DEBUG

try-catch看log

我就只好加了try-catch。并且输出exception时候极其的全乎。期待能找到问题在哪。

try {
      // function
     } catch (Exception e) {
          System.debug('Exception type caught: ' + e.getTypeName());
          System.debug('Message: ' + e.getMessage());
          System.debug('Cause: ' + e.getCause()); // returns null
          System.debug('Line number: ' + e.getLineNumber());
          System.debug('Stack trace: ' + e.getStackTraceString());
     }

选择只跑第一个失败的case03。log输出:

20:27:28:539 USER_DEBUG [230]|DEBUG|Exception type caught: System.StringException
20:27:28:540 USER_DEBUG [231]|DEBUG|Message: Invalid id: 20220315ZZ
20:27:28:540 USER_DEBUG [232]|DEBUG|Cause: null
20:27:28:540 USER_DEBUG [233]|DEBUG|Line number: -1
20:27:28:540 USER_DEBUG [234]|DEBUG|Stack trace: External entry point
20:27:26:000 USER_DEBUG Class.NJS_KAProcessAbstractBase.execute: line 42, column 1
20:27:26:000 USER_DEBUG Class.NJS_KAAContPayFormRetChgAggProcessTest.kAAContPayFormRetChgAggProcessTest03: line 299, column 1

这里的20220315ZZ是一个12位的字符串明显不符合Salesforce ID的形式:18位(旧的有可能是16位)不规律ID。所以Message是Invalid id。这其实是一个线索。

TestClass 299行指向的就是主方法,说了跟没说一样

System.debug

看来try-catch并不能告诉我准确的Exception发生在哪一行,那就只好用System.debug()方法了。
在可疑的地方加上就可以缩小范围。最终也是靠它解决了问题。

结果


LOG

// 通过log可知,这两个参数没有问题
System.debug('collectInfoProcessManage:'+collectInfoProcessManage);
System.debug('collectInfoProcessDetailsListPara:'+collectInfoProcessDetailsListPara);
// 这两句没有输出,说明问题范围在70~81行
System.debug('returnOrgCodeSet:'+returnOrgCodeSet);
System.debug('detailMap:'+detailMap);

也许有人一眼就能看出问题。
问题就是

Map detailMap = new Map();

往一个Key为Id类型里Put String的Key,StringId类型不匹配,报出了System.StringException异常所以会提示Message: Invalid id.
解决方法:
Map detailMap = new Map();