bytedance / mockey

a simple and easy-to-use golang mock library
Apache License 2.0
556 stars 22 forks source link

记录每次被mock函数的实际入参和when中提供的fun形参类型可以为any #52

Closed lodan-sya closed 2 months ago

lodan-sya commented 4 months ago

1、目前mock对象有记录 方法被mock的次数和方法被调用的次数,希望能增加记录每次调用被mock函数的实际入参(可以用队列存储,后进先出)

2、使用条件When/To时,目前限制了fun(xx xx,xx xx)形参类型需要与被mock函数的形参长度和类型一致,目前期望使用When时,只限制fun中的形参长度一致即可,类型可以使用any, 因为有些场景,如被mock函数的入参 是非导出struct,这时需要使用 When来判断入参是否符合条件而进行mock时,When的fun形参无法使用这个非导出struct类型

lodan-sya commented 4 months ago

如现有功能有方式解决上面两种场景,请给出示例,谢谢

lodan-sya commented 4 months ago

补充一下,单测用例都是单独写在一个包下的,跟非导出struct不在同一个包下 如 package utils type A struct { } type aInfo struct { Name string } func (A) Test4(test aInfo) string { return "test4" + ":" + test.Name } func VerTest4(b string) { info := aInfo{Name: b} a2 := A{} a2.Test4(info) }

测试用例在另外一个包 package main import ( . "github.com/bytedance/mockey" "gotest-utils/utils" ) func main() { build := Mock(utils.A.Test4).When(func(a utils.aInfo) bool { return "hhhh" == a.Name }).Return("yyyy").Build() utils.VerTest4("hhhh") println("mock次数:", build.MockTimes()) println("方法被调用的次数:", build.Times()) println("mock方法的实际入参(因为想断言入参):", build.xxxx()) build.UnPatch() } 这时候When/To节点中的func则无法使用非导出struct,所以希望 When/To 中func可以优化成any类型,由用户自己再去转回原来类型,并且希望能记录mock的实际参数

Sychorius commented 4 months ago

@lodan-sya 非导出场景目前暂不支持,不过你可以用反射绕过

//  fn := pkg.Func 
//  fn:= (*Class).Func
fn := mockey.GetMethod(obj,"FuncName") 
to := reflect.MakeFunc(reflect.TypeOf(fn), xxx ).Interface()
Mock(fn).To(to).Build()
xhd2015 commented 2 months ago

我建议使用xgo,可以实现你说的效果。 https://github.com/xhd2015/xgo