为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 中构建模拟类?

如何在 golang 中构建模拟类?

Go
翻阅古今 2022-03-07 22:40:47
我正在尝试为 golang 中的单元测试构建模拟类;有谁知道这是怎么做到的吗?例如,在下面的代码片段中,我想打印 FakeMyClass.Object 的返回值。package mainimport (    "fmt")type MyClass struct {}func (*MyClass) Object() (int) {    return 0}func (mc *MyClass) PrintInfo() {    fmt.Printf("%v\n", mc.Object())}type FakeMyClass struct {    MyClass}func (*FakeMyClass) Object() (int) {    return 1}func main() {    mc := &FakeMyClass{}    mc.PrintInfo()}
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

我更喜欢使用github.com/stretchr/testify/tree/master/mock


package main


import (

    "fmt"

    "github.com/stretchr/testify/mock"

)


type MyClass struct {

}


func (*MyClass) Object() (int) {

    return 0

}


func (mc *MyClass) PrintInfo() {

    fmt.Printf("%v\n", mc.Object())

}


type FakeMyClass struct {

    mock.Mock

}


func (fmc *FakeMyClass) Object() (int) {

    args := fmc.Called()

    return args.Int(0)

}

func (fmc *FakeMyClass) PrintInfo() {

    fmt.Printf("%v\n", fmc.Object())

}


func main() {

    mc := &FakeMyClass{}

    mc.On("Object").Return(1)

    mc.PrintInfo()

    //mc.AssertExpectations(t)

}


查看完整回答
反对 回复 2022-03-07
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

我为此使用了 mockgen:

mockgen -source myModule.go -package myPackage -destination myModuleMock.go

您可以通过以下方式安装它:get get github.com/golang/mock


查看完整回答
反对 回复 2022-03-07
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

您正在寻找该Object()方法的虚拟调度。我所知道的 Go 中唯一的虚拟调度形式是使用接口。


PrintInfo然后将是一个使用该接口类型的函数。


例如:


package main


import (

    "fmt"

)


type WithObject interface {

    Object() int

}


func PrintInfo(wo WithObject) {

    fmt.Printf("%v\n", wo.Object())

}


type MyClass struct {

}


func (*MyClass) Object() (int) {

    return 0

}


type FakeMyClass struct {

    MyClass

}


func (*FakeMyClass) Object() (int) {

    return 1

}


func main() {

    fmc := &FakeMyClass{}

    PrintInfo(fmc)

}


查看完整回答
反对 回复 2022-03-07
  • 3 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信