猿问

如何在 golang 中构建模拟类?

我正在尝试为 golang 中的单元测试构建模拟类;有谁知道这是怎么做到的吗?例如,在下面的代码片段中,我想打印 FakeMyClass.Object 的返回值。


package main


import (

    "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()

}


翻阅古今
浏览 148回答 3
3回答

撒科打诨

我更喜欢使用github.com/stretchr/testify/tree/master/mockpackage mainimport (    "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)}

梦里花落0921

我为此使用了 mockgen:mockgen -source myModule.go -package myPackage -destination myModuleMock.go您可以通过以下方式安装它:get get github.com/golang/mock

饮歌长啸

您正在寻找该Object()方法的虚拟调度。我所知道的 Go 中唯一的虚拟调度形式是使用接口。PrintInfo然后将是一个使用该接口类型的函数。例如:package mainimport (    "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)}
随时随地看视频慕课网APP

相关分类

Go
我要回答