如何在golang中构建模拟类?

时间:2016-09-06 07:42:34

标签: unit-testing go

我试图在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()
}

4 个答案:

答案 0 :(得分:1)

我使用了mockgen:

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

您可以通过以下方式安装: 得到了github.com/golang/mock

答案 1 :(得分:0)

我更喜欢使用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)
}

答案 2 :(得分:0)

您可以创建一个返回模拟函数的结构,您可以使用每个测试用例传递要返回的值。例如:

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 {
     ObjectMock: func() int
}

func (fm *FakeMyClass) Object() int {
    return fm.ObjectMock()
}
func (fm *FakeMyClass) PrintInfo() {
    fmt.Printf("%v\n", fm.Object())
}

func main() {

    mc := &FakeMyClass{
        // Create the mocked function here, to be called when the Object() function is called.
        ObjectMock: func() int {
            return 0
        }
    }

    mc.PrintInfo()
}

答案 3 :(得分:0)

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

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

E.g:

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)
}