JsonPath 驗證類既 Groovy 過載操作符實踐
在使用JsonPath工具類封裝進行介面響應的驗證過程中,由於使用原生的JsonPath
的API
獲取到的值預設是object
,如果需要轉成其他型別需要多寫一些程式碼。
這一點對於將要提供給前端的工具類來講,著實有點缺憾。因為使用者在前端都在用文字標記語法來編寫用例的,如果可以的話,更需要用>、+、/、=這樣的語法標記就會更容易一些。
基於這樣的需求,再結合Groovy過載操作符(終極版)中學到的技能點,所以寫了一個用於JsonPath
驗證功能的verify
驗證類。
程式碼如下
package com.fun.utils
import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.JSONArray
import com.alibaba.fastjson.JSONException
import com.alibaba.fastjson.JSONObject
import com.fun.frame.SourceCode
import org.slf4j.Logger
import org.slf4j.LoggerFactory
/**
* 操作符重寫類,用於匹配JSonpath驗證語法,基本過載的方法以及各種比較方法,每個方法過載三次,引數為double,String,verify
* 數字統一採用double型別,無法操作的String物件的方法返回empty
*/
class Verify extends SourceCode implements Comparable {
public static Logger logger = LoggerFactory.getLogger(Verify.class)
/**
* 驗證文字
*/
String extra
/**
* 驗證數字格式
*/
double num
/**
* 構造方法,暫時寫著,儘量使用jsonutil創造verify物件
*
* @param json
* @param path
*/
private Verify(JSONObject json, String path) {
this(JsonUtil.getInstance(json).getString(path))
if (isNumber()) num = changeStringToDouble(extra)
}
private Verify(String value) {
extra = value
logger.info("構建verify物件:{}",extra)
if (isNumber()) num = changeStringToDouble(extra)
}
/**
* 獲取例項方法
* @param json
* @param path
* @return
*/
static Verify getInstance(JSONObject json, String path) {
new Verify(json, path)
}
static Verify getInstance(String str) {
new Verify(str)
}
/**
* 加法過載
* @param i
* @return
*/
def plus(double i) {
isNumber() ? num + i : extra + i.toString()
}
/**
* 加法過載,string型別
* @param s
* @return
*/
def plus(String s) {
isNumber() && isNumber(s) ? num + changeStringToDouble(s) : extra + s
}
/**
* 加法過載,verify型別
* @param s
* @return
*/
def plus(Verify v) {
isNumber() && v.isNumber() ? this + (v.num) : extra + v.extra
}
/**
* 減法過載
* @param i
* @return
*/
def minus(double i) {
isNumber() ? num - i : extra - i.toString()
}
/**
* 加法過載,string型別
* @param s
* @return
*/
def minus(String s) {
extra - s
}
def minus(Verify v) {
if (isNumber() && v.isNumber()) this - v.num
extra - v.extra
}
/**
* extra * i 這裡會去強轉double為int,呼叫intvalue()方法
* @param i
* @return
*/
def multiply(double i) {
if (isNumber()) num * i
extra * i
}
def multiply(String s) {
isNumber() ? isNumber(s) ? num * changeStringToDouble(s) : s * num : isNumber(s) ? extra * changeStringToDouble(s) : EMPTY
}
def multiply(Verify v) {
this * v.extra
}
/**
* 除法過載
* @param i
* @return
*/
def div(int i) {
if (isNumber()) num / i
}
def div(String s) {
if (isNumber() && isNumber(s)) num / changeStringToDouble(s)
}
def div(Verify v) {
if (isNumber() && v.isNumber()) num / v.num
}
def mod(int i) {
if (isNumber()) (int) (num % i * 10000) * 1.0 / 10000
}
/**
* 直接取值,用於陣列型別
* @param i
* @return
*/
def getAt(int i) {
try {
JSONArray.parseArray(extra)[i]
} catch (JSONException e) {
i >= extra.length() ? EMPTY : extra[i]
}
}
/**
* 直接取值,使用者json型別
* @param i
* @return
*/
def getAt(String s) {
try {
JSON.parseObject(extra)[s]
} catch (JSONException e) {
extra.indexOf(s)
}
}
/**
* if (a implements Comparable) { a.compareTo(b) == 0 } else { a.equals(b) }* @param a
* @return
*/
boolean equals(Verify verify) {
extra == verify.extra
}
boolean equals(Number n) {
num == n.doubleValue()
}
boolean equals(String s) {
extra == s
}
@Override
boolean equals(Object o) {
extra == o.toString()
}
/**
* a <=> b a.compareTo(b)
* a>b a.compareTo(b) > 0
* a>=b a.compareTo(b) >= 0
* a<b a.compareTo(b) < 0
* a<=b a.compareTo(b) <= 0
* @param o
* @return
*/
@Override
int compareTo(Object o) {
if (isNumber() && (o instanceof Number || isNumber(o.toString()))) {
return num.compareTo(o.toString() as Double)
} else {
extra.length().compareTo(o.toString().length())
}
}
/**
* 型別轉換,用於as關鍵字
* @param tClass
* @return
*/
def <T> T asType(Class<T> tClass) {
logger.info("強轉型別:{}", tClass.toString())
if (tClass == Integer) num.intValue()
else if (tClass == Double) num
else if (tClass == Long) num.longValue()
else if (tClass == String) extra
else if (tClass == Verify) new Verify(extra)
else if (tClass == Boolean) changeStringToBoolean(extra)
}
/**
* 使用者正則匹配
* @param regex
* @return
*/
def regex(String regex) {
extra ==~ regex
}
/**
* 是否是數字
* @return
*/
def isNumber() {
isNumber(extra)
}
/**
* 是否為boolean型別
* @return
*/
def isBoolean() {
extra ==~ ("false|true")
}
@Override
String toString() {
extra
}
}
演示程式碼
package com.fun.ztest.groovy
import com.fun.frame.httpclient.FanLibrary
import com.fun.utils.Verify
class Ft extends FanLibrary {
public static void main(String[] args) {
def instance1 = Verify.getInstance("fdsafds")
def instance2 = Verify.getInstance("fdsa")
def instance3 = Verify.getInstance("0.2365")
def instance4 = Verify.getInstance("5.0")
def instance5 = Verify.getInstance("5")
println instance1 + instance2
println instance1 - instance2
println instance1 * instance2 as boolean
println instance3 > instance4
println instance3 * instance4
println instance1 * instance4
println instance5 == instance4
println instance5 / instance4
println instance4 as Integer
testOver()
}
}
控制檯輸出
INFO-> 當前使用者:fv,IP:10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.6
INFO-> 構建verify物件:fdsafds
INFO-> 構建verify物件:fdsa
INFO-> 構建verify物件:0.2365
INFO-> 構建verify物件:5.0
INFO-> 構建verify物件:5
fdsafdsfdsa
fds
false
false
1.1824999999999999
fdsafdsfdsafdsfdsafdsfdsafdsfdsafds
true
1.0
INFO-> 強轉型別:class java.lang.Integer
5
Process finished with exit code 0
公眾號FunTester首發,原創分享愛好者,騰訊雲和掘金社群首頁推薦,知乎七級原創作者,歡迎關注、交流,禁止第三方擅自轉載。
FunTester熱文精選
相關文章
- Groovy探索 DSL在Calendar類上的實踐 一
- 自定義類載入器驗證類載入機制
- dart基礎之類介面操作符過載相關Dart
- 滑動驗證碼實踐
- C++操作符過載C++
- C++ 操作符過載C++
- 操作符過載集錦
- lumen驗證類 實現控制器場景驗證
- 簡訊驗證碼“最佳實踐”
- Laravel 驗證類 實現 路由場景驗證 和 控制器場景驗證Laravel路由
- PHP 中的操作符過載PHP
- 身份證驗證工具類
- 第二十篇:類操作符過載的相關規定與具體實現示例
- Kotlin——初級篇(五):操作符與操作符過載一Kotlin
- c#一元操作符過載C#
- json web token 實踐登入以及校驗碼驗證JSONWeb
- 領域驅動設計實踐——驗證(一)
- Kerberos 身份驗證在 ChunJun 中的落地實踐ROS
- 實戰分析Tomcat的類載入器結構(使用Eclipse MAT驗證)TomcatEclipse
- Python實踐:模組自動過載Python
- 通過selenium突破極驗驗證實現登入
- 在ASP.NET MVC中使用Knockout實踐06,自定義驗證、非同步驗證ASP.NETMVC非同步
- 自用驗證類封裝封裝
- C++ operator關鍵字(過載操作符)C++
- 驗證Kubernetes YAML的最佳實踐和策略YAML
- JVM 判斷物件已死,實踐驗證GC回收JVM物件GC
- Laravel 驗證碼類實現 (供學習、參考)Laravel
- easy-captcha實現驗證碼驗證APT
- 類載入過程
- java實現手機簡訊驗證全過程Java
- 活動 Web 頁面人機識別驗證的探索與實踐Web
- 重新整理 .net core 實踐篇—————3種配置驗證[十四]
- 在ASP.NET MVC中使用Knockout實踐05,基本驗證ASP.NETMVC
- HACCP原理——驗證程式(轉載)
- 表單驗證工具類ValidationUtils
- PHP版本的IP段驗證類PHP
- Groovy核心類原始碼講解(上)原始碼
- 後端安全驗證過程後端