How to build mock class in golang?

huangapple go评论100阅读模式
英文:

How to build mock class in golang?

问题

我正在尝试在Golang中为单元测试构建模拟类,有人知道如何做吗?例如,在下面的代码片段中,我想打印出FakeMyClass.Object的返回值。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type MyClass struct {
  6. }
  7. func (*MyClass) Object() int {
  8. return 0
  9. }
  10. func (mc *MyClass) PrintInfo() {
  11. fmt.Printf("%v\n", mc.Object())
  12. }
  13. type FakeMyClass struct {
  14. MyClass
  15. }
  16. func (*FakeMyClass) Object() int {
  17. return 1
  18. }
  19. func main() {
  20. mc := &FakeMyClass{}
  21. mc.PrintInfo()
  22. }
英文:

I'm trying to build mock class for unit test in golang; does anyone know how to do that? For example, in the following code slice, I'd like to print FakeMyClass.Object's return value.

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type MyClass struct {
  6. }
  7. func (*MyClass) Object() (int) {
  8. return 0
  9. }
  10. func (mc *MyClass) PrintInfo() {
  11. fmt.Printf("%v\n", mc.Object())
  12. }
  13. type FakeMyClass struct {
  14. MyClass
  15. }
  16. func (*FakeMyClass) Object() (int) {
  17. return 1
  18. }
  19. func main() {
  20. mc := &FakeMyClass{}
  21. mc.PrintInfo()
  22. }

答案1

得分: 2

我更喜欢使用github.com/stretchr/testify/tree/master/mock

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/stretchr/testify/mock"
  5. )
  6. type MyClass struct {
  7. }
  8. func (*MyClass) Object() (int) {
  9. return 0
  10. }
  11. func (mc *MyClass) PrintInfo() {
  12. fmt.Printf("%v\n", mc.Object())
  13. }
  14. type FakeMyClass struct {
  15. mock.Mock
  16. }
  17. func (fmc *FakeMyClass) Object() (int) {
  18. args := fmc.Called()
  19. return args.Int(0)
  20. }
  21. func (fmc *FakeMyClass) PrintInfo() {
  22. fmt.Printf("%v\n", fmc.Object())
  23. }
  24. func main() {
  25. mc := &FakeMyClass{}
  26. mc.On("Object").Return(1)
  27. mc.PrintInfo()
  28. //mc.AssertExpectations(t)
  29. }
英文:

I prefer to use github.com/stretchr/testify/tree/master/mock

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/stretchr/testify/mock"
  5. )
  6. type MyClass struct {
  7. }
  8. func (*MyClass) Object() (int) {
  9. return 0
  10. }
  11. func (mc *MyClass) PrintInfo() {
  12. fmt.Printf("%v\n", mc.Object())
  13. }
  14. type FakeMyClass struct {
  15. mock.Mock
  16. }
  17. func (fmc *FakeMyClass) Object() (int) {
  18. args := fmc.Called()
  19. return args.Int(0)
  20. }
  21. func (fmc *FakeMyClass) PrintInfo() {
  22. fmt.Printf("%v\n", fmc.Object())
  23. }
  24. func main() {
  25. mc := &FakeMyClass{}
  26. mc.On("Object").Return(1)
  27. mc.PrintInfo()
  28. //mc.AssertExpectations(t)
  29. }

答案2

得分: 1

我用mockgen来实现:

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

你可以通过以下方式安装它:
go get github.com/golang/mock

英文:

I used mockgen for it:

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

You can install it by:
got get github.com/golang/mock

答案3

得分: 0

你可以创建一个返回模拟函数的结构体,在每个测试用例中传入你想要返回的值。例如:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type MyClass struct{}
  6. func (*MyClass) Object() int {
  7. return 0
  8. }
  9. func (mc *MyClass) PrintInfo() {
  10. fmt.Printf("%v\n", mc.Object())
  11. }
  12. type FakeMyClass struct {
  13. ObjectMock func() int
  14. }
  15. func (fm *FakeMyClass) Object() int {
  16. return fm.ObjectMock()
  17. }
  18. func (fm *FakeMyClass) PrintInfo() {
  19. fmt.Printf("%v\n", fm.Object())
  20. }
  21. func main() {
  22. mc := &FakeMyClass{
  23. // 在这里创建模拟函数,在调用 Object() 函数时将被调用。
  24. ObjectMock: func() int {
  25. return 0
  26. },
  27. }
  28. mc.PrintInfo()
  29. }

这段代码展示了如何创建一个模拟函数的结构体,并在调用 Object() 函数时使用模拟函数返回值。

英文:

You can make a struct that returns mocked functions, which you pass in with each test case for values you want returned. For example:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type MyClass struct{}
  6. func (*MyClass) Object() int {
  7. return 0
  8. }
  9. func (mc *MyClass) PrintInfo() {
  10. fmt.Printf("%v\n", mc.Object())
  11. }
  12. type FakeMyClass struct {
  13. ObjectMock: func() int
  14. }
  15. func (fm *FakeMyClass) Object() int {
  16. return fm.ObjectMock()
  17. }
  18. func (fm *FakeMyClass) PrintInfo() {
  19. fmt.Printf("%v\n", fm.Object())
  20. }
  21. func main() {
  22. mc := &FakeMyClass{
  23. // Create the mocked function here, to be called when the Object() function is called.
  24. ObjectMock: func() int {
  25. return 0
  26. }
  27. }
  28. mc.PrintInfo()
  29. }

答案4

得分: 0

你正在寻找在Object()方法上进行虚拟调度。我所知道的Go语言中唯一的虚拟调度形式是使用接口。

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

例如:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type WithObject interface {
  6. Object() int
  7. }
  8. func PrintInfo(wo WithObject) {
  9. fmt.Printf("%v\n", wo.Object())
  10. }
  11. type MyClass struct {
  12. }
  13. func (*MyClass) Object() int {
  14. return 0
  15. }
  16. type FakeMyClass struct {
  17. MyClass
  18. }
  19. func (*FakeMyClass) Object() int {
  20. return 1
  21. }
  22. func main() {
  23. fmc := &FakeMyClass{}
  24. PrintInfo(fmc)
  25. }

希望这能帮到你!

英文:

You are looking for virtual dispatch on the Object() method. The only form of virtual dispatch that I know of in Go is to use interfaces.

PrintInfo will then be a function that uses that interface type.

E.g.:

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type WithObject interface {
  6. Object() int
  7. }
  8. func PrintInfo(wo WithObject) {
  9. fmt.Printf("%v\n", wo.Object())
  10. }
  11. type MyClass struct {
  12. }
  13. func (*MyClass) Object() (int) {
  14. return 0
  15. }
  16. type FakeMyClass struct {
  17. MyClass
  18. }
  19. func (*FakeMyClass) Object() (int) {
  20. return 1
  21. }
  22. func main() {
  23. fmc := &FakeMyClass{}
  24. PrintInfo(fmc)
  25. }

huangapple
  • 本文由 发表于 2016年9月6日 15:42:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/39343282.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定