网站过期会怎样解决,东莞经济贸易学校网络营销,怎么优化网站关键词,电脑系统做的好的网站好题目一#xff1a;单元测试中使用—打桩
打桩概念#xff1a;使用A替换 原函数B#xff0c;那么A就是打桩函数打桩原理#xff1a;运行时#xff0c;通过一个包#xff0c;将内存中函数的地址替换为桩函数的地址打桩操作#xff1a;利用Patch#xff08;#xff09;函…题目一单元测试中使用—打桩
打桩概念使用A替换 原函数B那么A就是打桩函数打桩原理运行时通过一个包将内存中函数的地址替换为桩函数的地址打桩操作利用Patch函数将调用外部依赖等函数数据库等依赖函数替换为自己写的函数这样就是实现了不对外部数据的一个强依赖最简单的用法官方解释Monkey’s API is very simple and straightfoward. Call monkey.Patch(, ) to replace a function. For example:
package mainimport (fmtosstringsbou.ke/monkey
)func main() {monkey.Patch(fmt.Println, func(a ...interface{}) (n int, err error) {s : make([]interface{}, len(a))for i, v : range a {s[i] strings.Replace(fmt.Sprint(v), hell, *bleep*, -1)}return fmt.Fprintln(os.Stdout, s...)})fmt.Println(what the hell?) // what the *bleep*?
}下面是对一个io文件的mock示例文件为外部依赖存在不稳定性质因此使用mock
package testimport (bou.ke/monkeybufiogithub.com/stretchr/testify/assertosstringstesting
)func readFirstLine() string {open, err : os.Open(file.txt)defer open.Close()if err ! nil {return }scanner : bufio.NewScanner(open)for scanner.Scan() {return scanner.Text()}return
}func replaceLine() string {line : readFirstLine()afterReplace : strings.ReplaceAll(line, 11, 00)return afterReplace
}func TestReplace(t *testing.T) {monkey.Patch(readFirstLine, func() string { //注意是readFirstLine函数名而不是readFirstLinereturn line11})defer monkey.Unpatch(readFirstLine) // 注意是readFirstLine函数名而不是readFirstLineres : replaceLine()assert.Equal(t, line00, res)
}
题二defer、recovery、panic执行顺序
准则panic当前函数的下一行代码不会被执行到当 panic 被触发后Go 语言的运行时机制会开始查找当前函数以及调用栈上的所有 defer 函数然后依次执行它们。在这个过程中如果某个 defer 函数中使用了 recover 函数那么 recover 就可以捕获到之前触发的 panic 异常恢复程序的正常执行流程从引发 panic 的函数返回继续执行后续代码,注意是直接在panic那里returnpanic当前函数的下面的代码依然不会被执行但是其他后续代码可以执行并且 recover 会返回 panic 时传递的参数在这里就是 “触发一个异常” 这个字符串可以在 defer 函数中根据返回值进行相应的处理比如打印异常信息等。
package mainimport fmtfunc inner() {defer func() {if r : recover(); r! nil {fmt.Printf(inner函数中的defer通过recover捕获到异常异常信息: %v\n, r)}}()panic(inner函数中触发异常)defer fmt.Println(这一行代码直接不会被执行)
}func outer() {defer func() {fmt.Println(outer函数中的defer执行了)}()inner()
}func main() {fmt.Println(程序开始执行)outer() //其中发生了panic如果没有recovery下面的代码将不再执行fmt.Println(outer函数调用结束后继续执行main函数后面的代码)
}