2016-09-06 33 views
1

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

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() 
} 
+0

https://github.com/golang/mock –

+0

@SachinNambiarNalavattanon,不知道哪一个更受欢迎,gmock或测试ify/mock? –

回答

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

BTW你应该声明由MyClass的和FakeMyClass实现一个接口,这样你就可以高高兴兴地传递或者在你的代码 – Plato

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() 
} 
+0

这是我找到作证/模拟之前所使用的方法中的其他功能输入,这个工程太伟大 – Plato

+0

我比如testify/mock的样子(之前没有实际使用过),我猜想它依赖OP来引入额外的包依赖关系。 – fitzy101

0

您正在寻找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) 
} 
1

我用mockgen它:

mockgen -source myModule.go -package mypackage的-destination myModuleMock.go

您可以通过安装它: 得到得到github.com/golang/mock