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