在 golang 单元测试中,覆盖私有方法可以通过以下手段完成:反射:使用反射访问私有字段和方法,通过函数 reflect.valueof 和 reflect.methodbyname。接口:创建接口定义私有方法,并使用接口编写测试,通过变量类型断言和接口类型分配。
在 GoLang 单元测试中覆盖私有方法
在 GoLang 中进行单元测试时,覆盖私有方法可能颇具挑战性。但是,可以通过一些技巧来实现它。
使用反射
立即学习“go语言免费学习笔记(深入)”;
反射允许您访问私有字段和方法。为此,您可以使用 reflect.ValueOf 和 reflect.MethodByName 函数。例如:
import ( "reflect" "testing" ) // MyStruct 是一个具有私有 add 方法的结构体。 type MyStruct struct { value int } func (s *MyStruct) add(x int) int { return s.value + x } func TestAdd(t *testing.T) { s := MyStruct{value: 10} v := reflect.ValueOf(&s) m := v.MethodByName("add") inputs := []int{5, 10} expected := []int{15, 20} for i, input := range inputs { out := m.Call([]reflect.Value{v, reflect.ValueOf(input)})[0] if out.Int() != expected[i] { t.Errorf("add(%d) = %d, want %d", input, out.Int(), expected[i]) } } }
使用 interfaces
可以为私有方法创建接口,并使用接口来编写测试。例如:
// Adder 接口定义 add 方法。 type Adder interface { add(int) int } type MyStruct2 struct { value int } func (s *MyStruct2) add(x int) int { return s.value + x } // 使用 Adder 接口编写测试。 func TestAdd2(t *testing.T) { var a Adder = &MyStruct2{value: 10} inputs := []int{5, 10} expected := []int{15, 20} for i, input := range inputs { out := a.add(input) if out != expected[i] { t.Errorf("add(%d) = %d, want %d", input, out, expected[i]) } } }
以上就是golang单元测试中如何覆盖私有方法?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号