如何在golang中构建模拟类?
问题描述:
我想在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()
}
答
我更喜欢使用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
答
您可以返回嘲笑功能,您与每个测试用例传递你想要返回值的结构。例如:
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()
}
答
您正在寻找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)
}
答
我用mockgen它:
mockgen -source myModule.go -package mypackage的-destination myModuleMock.go
您可以通过安装它: 得到得到github.com/golang/mock
https://github.com/golang/mock –
@SachinNambiarNalavattanon,不知道哪一个更受欢迎,gmock或测试ify/mock? –