golang单元测试中如何覆盖私有方法?

在 golang 单元测试中,覆盖私有方法可以通过以下手段完成:反射:使用反射访问私有字段和方法,通过函数 reflect.valueof 和 reflect.methodbyname。接口:创建接口定义私有方法,并使用接口编写测试,通过变

golang 单元测试中,覆盖私有方法可以通过以下手段完成:反射:使用反射访问私有字段和方法,通过函数 reflect.valueof 和 reflect.methodbyname。接口:创建接口定义私有方法,并使用接口编写测试,通过变量类型断言和接口类型分配。

golang单元测试中如何覆盖私有方法?

在 GoLang 单元测试中覆盖私有方法

在 GoLang 中进行单元测试时,覆盖私有方法可能颇具挑战性。但是,可以通过一些技巧来实现它。

使用反射

反射允许您访问私有字段和方法。为此,您可以使用 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单元测试中如何覆盖私有方法?的详细内容,更多请关注叮当号网其它相关文章!

文章来自互联网,只做分享使用。发布者:城南北边,转转请注明出处:https://www.dingdanghao.com/article/666357.html

(0)
上一篇 2024-07-31 11:00
下一篇 2024-07-31 11:00

相关推荐

联系我们

在线咨询: QQ交谈

邮件:442814395@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信公众号