記錄后臺(tái)遇到的兩個(gè)小問(wèn)題
作者:weiewiyi
來(lái)源:SegmentFault 思否社區(qū)
specification查詢(xún)不起作用
寫(xiě)后臺(tái)的時(shí)候需要加一個(gè)specification查詢(xún),只返回屬于該社區(qū)的數(shù)據(jù)。

于是我增加了如圖紅框中的查詢(xún),調(diào)用了and函數(shù)。
specification.and(VehicleSpecs.belongToCommunity(district.getId()));
但是執(zhí)行后發(fā)現(xiàn),這條查詢(xún)沒(méi)有按照想法獲取到查詢(xún)到數(shù)據(jù),相當(dāng)于這條查詢(xún)并沒(méi)有作用。在打斷點(diǎn)之后,發(fā)現(xiàn)確實(shí)進(jìn)入了查詢(xún)函數(shù)里。
測(cè)試了很多遍還是如此,這條查詢(xún)語(yǔ)句并沒(méi)有起作用。
后來(lái)查谷歌之后發(fā)現(xiàn)有人和我遇到同樣的問(wèn)題。
解決方法很簡(jiǎn)單:
讓specification等于and函數(shù)返回值

也就是這樣:
specification = specification.and(VehicleSpecs.belongToCommunity(district.getId()));
然后回過(guò)頭看and函數(shù)的聲明才發(fā)現(xiàn):
返回的是一個(gè)Specification類(lèi)型的數(shù)據(jù)。也就是說(shuō),我并沒(méi)有保存這個(gè)數(shù)據(jù),所以查詢(xún)失效了。
應(yīng)該重新給本地變量賦值。這樣才能使查詢(xún)真正添加上去。

之后回過(guò)頭來(lái)想想,我沒(méi)有想到重新賦值的原因,可能是習(xí)慣了下圖中的方式,即調(diào)用了函數(shù),就真正地把數(shù)據(jù)添加了進(jìn)去,不用再去重新賦值。

總結(jié)來(lái)說(shuō)還是需要真正看函數(shù)的聲明,查看它的返回值,以確定是否需要執(zhí)行相關(guān)的操作。因?yàn)檫@個(gè)函數(shù)的用法和返回值都寫(xiě)在了聲明中。
單元測(cè)試數(shù)據(jù)不一致
在單元測(cè)試中,第187行發(fā)生的錯(cuò)誤。
MockMvc返回的值與期望的值不一致

但是去控制臺(tái)一看:值是相同的。期望值是0,實(shí)際值也是0。這就很奇怪了,期望值和實(shí)際值相同,為什么兩者沒(méi)有通過(guò)判斷呢。

很容易聯(lián)系到是類(lèi)型出了問(wèn)題。
測(cè)試發(fā)現(xiàn),Long,Integer, String, 都通過(guò)了。沒(méi)通過(guò)的是Short類(lèi)型的數(shù)據(jù),即紅框中的數(shù)據(jù)。

后來(lái)在后面加上 .toString()能正常通過(guò)。

這里mvc的json類(lèi)型的數(shù)據(jù)是string類(lèi)型, 與short類(lèi)型數(shù)據(jù)判斷的時(shí)候失敗了,可能是兩者不能正常識(shí)別。

