日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang中的Mock依赖

發(fā)布時間:2025/6/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中的Mock依赖 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Mock依賴

有的時候,由于業(yè)務(wù)邏輯的復(fù)雜性,功能代碼并不會就這么直接,往往還會摻雜很多其他組件,這就給我們的測試工作帶來很大的麻煩,我這里列舉幾個常見的依賴:

  • 組件依賴
  • 函數(shù)依賴

組件依賴和函數(shù)依賴是兩種比較常見的依賴,但是,這兩種依賴也是可以擴展開來說的,既可能來自于我們自己編寫的組件/函數(shù),也可能是引入其他人寫的。但是,無妨,對于這些情況,我們都會做一些分析

組件依賴處理

傳一個 Stub 組件進入,從而達到控制依賴組件行為的效果

舉一個例子先,例如我們比較常見的 Service 層和 DAO 層的操作,Service 處理完邏輯之后,交給 DAO 層進行持久化,或者需要調(diào)用 DAO 層從持久化中獲取一些必要的數(shù)據(jù);在測試的時候,我們很多時候不希望真的持久化或者從持久化中獲取數(shù)據(jù),那么就會對 DAO 層進行一些 Mock

import "fmt"type Data struct {Field string }type Dao interface {ReadAll() []DataSaveData(d *Data) }type MongoDao struct {}func (d MongoDao) ReadAll() []Data {return []Data{} }func (d MongoDao) SaveData(data *Data) {//... }type Service struct {Dao *Dao }func (s *Service) Login (username string) bool {users := (*s.Dao).ReadAll()for _, user := range users {if username == user.Field {return true}}return false }func Newservice(d Dao) *Service {srv := Service{Dao: &d}return &srv }func main() {d := MongoDao{}srv := Newservice(d)fmt.Println(srv.Login("abc")) }

這里我們想要測試Service的正確性,但是又不想要真的持久化 DAO,所以,這個時候我們會自己創(chuàng)建一個 Stub,然后提供給 Service,同時,我們還能操作 DAO 的行為,達到運行得效果

//用StubDao代替Mongodb type StubDao struct {}func (d StubDao) ReadAll() []Data {return []Data{Data{"abc"}} }func (d StubDao) SaveData(data *Data) { }func TestLogin(t *testing.T) {d := StubDao{}srv := NewService(d)rst := srv.Login("abc")if !rst {t.Error("login error")} }

這里對測試代碼稍微改了一下,可以發(fā)現(xiàn),我們可以通過修改一個變量來控制 Stub 的輸出,從而達到測試不同功能的效果,這就解決了組件依賴的問題

函數(shù)依賴

函數(shù)依賴相比于組件依賴會更麻煩一點,因為我們在前面可以看到,組件依賴的話我們可以傳遞 Stub 進行,這樣我們可以隨意得控制 Stub 的行為,但是函數(shù)不行呀,這里我們又不能傳函數(shù)進去,因為函數(shù)是被 import 進去的啊。問題就在這了,因為函數(shù)是被 import 進去的,所以可以理解為函數(shù)是全局的了,既然這樣,那么我們?yōu)槭裁床恍薷囊幌潞瘮?shù)呢?什么意思?我們先來看著正常的業(yè)務(wù)例子

var Login = func(username, password string) bool {if username == password {return false}return true }func Reply(username, password, msg string) bool {if Login(username, password) {fmt.Println(msg)return true}return false }func stu() {Reply("a", "b", "aa")Reply("a", "b", "bb") }

要先登錄,然后登錄完之后我們才能回復(fù)消息,這里我們的登錄邏輯是簡單的,但是,在實際業(yè)務(wù)中可能這里的登錄邏輯就設(shè)計到 DB 訪問等等,我們希望不走真實的邏輯,而是自己來控制Login的行為

先分析一下我們的 UT 目的,我們的目的是測試Reply函數(shù),我們期望是Login成功,那么Reply也應(yīng)該是成功的;如果Login失敗,那么Reply也應(yīng)該是失敗的。這個測試結(jié)論不應(yīng)該被Login所影響,及時以后Login邏輯修改了,我們也應(yīng)該是這個邏輯,不會受到影響,那么我們可以這么編寫 UT

func TestSuccReply(t *testing.T) {origLogin := Logindefer func() {Login = origLogin}()Login = func(username, password string) bool {return true}if !Reply("a", "a", "aaa") {t.Errorf("reply false for login success")} }func TestLogin(t *testing.T) {origLogin := Logindefer func() {Login = origLogin}()Login = func(username, password string) bool {return false}if Reply("a", "a", "aa") {t.Errorf("reply true for login fail")} }

這里可以發(fā)現(xiàn),我們是修改了Login這個函數(shù)的代碼,從而控制Login函數(shù)的返回值,這樣我們就可以測試我們寫的代碼的邏輯是否正確了

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的golang中的Mock依赖的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美激情免费在线观看 | 亚洲成人播放器 | 欧美三级午夜理伦三级 | 欧美日韩高清不卡 | 亚洲免费视频观看 | 91高跟黑色丝袜呻吟动态图 | 91夫妻论坛 | 国产精品7777 | 五月天婷婷爱 | 国产精品一区二区电影 | 毛片链接 | 国产乱码精品一区二三区蜜臂 | 天天射天天搞 | 久久在线中文字幕 | 欧美日韩成人免费观看 | 91久久精品一区二区 | 日韩免费视频一区二区视频在线观看 | 午夜在线视频免费 | 91视频最新地址 | 亚洲视频日韩 | 国产3p精品一区 | 69视频入口 | 国产模特av私拍大尺度 | 91在线一区 | 久久精品专区 | 高潮疯狂过瘾粗话对白 | 欧洲美一区二区三区亚洲 | 91麻豆免费看 | 亚洲精品aaaa | 久久免费毛片 | 国产成人啪免费观看软件 | 国产色图视频 | 国产在线精品一区二区 | 欧美黑人疯狂性受xxxxx喷水 | 亚洲女人在线 | 日本暧暧视频 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 久久久久久久久久艹 | 欧美另类日韩 | av最新 | 免费在线 | 国产精品1区2区3区4区 | 口舌奴vk | 成人涩涩软件 | 欧美成人综合色 | 欧美日韩一区二区中文字幕 | 成人一区二区av | 我我色综合 | av大全在线播放 | 自拍偷拍福利 | 自拍偷拍亚洲视频 | 3p在线播放 | 麻豆视| 亚洲成a人在线观看 | 久久人人爽人人爽人人 | 在线观看福利网站 | 久综合 | 调教小屁屁白丝丨vk | 国产又粗又猛又爽又黄无遮挡 | 97超碰人人在线 | 九九视频在线播放 | 麻豆毛片 | 国产一级视频在线观看 | 亚洲专区av | 国产日韩欧美日韩大片 | 美女日日日 | 四虎精品永久在线 | 国产精品无码久久久久成人app | www.69视频 | 国产午夜视频在线观看 | 久久韩国| 日韩福利视频 | 二三区视频| 日韩视频欧美视频 | 欧美激情免费在线 | 天天在线免费视频 | 窝窝午夜影院 | 看黄免费网站 | 国产精品综合一区二区 | 国语毛片| 亚洲欧美日韩国产精品 | 丰满人妻一区二区三区53视频 | 婷婷成人av| 综合久久综合久久 | 另类一区二区三区 | 国产精品视频免费播放 | 日韩色图片 | 色欧美88888久久久久久影院 | 国产丝袜av | www好男人 | 久久久久久免费毛片精品 | 成人毛片一区二区三区 | 亚色成人| 爱情岛亚洲首页论坛小巨 | 欧美女人天堂 | av黄色一级片 | 欧美bbbbbbbbbbbb1| а√天堂资源官网在线资源 | 私库av在线|