记录一个测试时候遇到的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
往一个Key为Id
类型里Put String
的Key,String
与Id
类型不匹配,报出了System.StringException
异常所以会提示Message: Invalid id
.
解决方法:
Map