agiledragon / gomonkey

gomonkey is a library to make monkey patching in unit tests easy
MIT License
1.96k stars 179 forks source link

ApplyMethod mock 非导出成员方法报 “retrieve method by name failed” #12

Closed wuqxuan closed 4 years ago

wuqxuan commented 4 years ago

type test struct{
    Name string
}

func(t *test) printName(){
  fmt.Println(t.Name)
}
// Err:“retrieve method by name failed”
ApplyMethod(reflect.TypeOf(s), "printName", func(_ *test)  {

  })
// 原因:ApplyMethod 底层调用reflect.TypeOf.MethodByName(methodName string), 若methodName为首字母小写,MethodByName 返回false。
package main
import (
    "fmt"
    "reflect"
)

type test struct{
    Name string
}

func(t *test) printName(){
  fmt.Println(t.Name)
}

func main() { 
      t := &test{}
      _,ok:=reflect.TypeOf(t).MethodByName("printName")
      fmt.Println(ok) // out:false
}
agiledragon commented 4 years ago

由于反射的限制,仅有包内作用域的方法名无法导出,README中的Notes中有说明

zhouguangming commented 4 years ago

@agiledragon 如果想 mock 私有方法有什么好的推荐吗? 我的单元测试希望尽量发生在一个函数内,不希望调用其他函数,因此就需要对私有方法进行 mock,但是目前没有找到什么好的办法