侦听以调用Golang中另一个结构使用的结构函数

时间:2018-08-30 20:06:15

标签: go mocking

所以我是Golang中具有模拟结构和函数的初学者。我基本上想检查是否已出于单元测试目的调用了函数。这是代码:

type A struct {

}

func (a *A) Foo (){}

type B struct {
    a *A
}

func (b* B) Bar () {
    a.Foo()
}

我基本上想检查在调用Bar时是否确实调用了Foo

我知道有一些可用于Golang的模拟框架,但是在测试现有struct和struct方法时,它们相当复杂

1 个答案:

答案 0 :(得分:0)

如果要测试B并查看它是否真的调用了A的Foo函数,则需要模拟出A对象。由于您要检查的功能是Foo,因此只需创建一个简单的Fooer接口(您在Go中将其称为函数,即功能加上“ er”)即可。将B对A的引用替换为对Fooer的引用,您就很好。我根据您的代码here on the Go Playground创建了一个小示例:

package main

import "testing"

type A struct {
}

func (a *A) Foo() {}

type Fooer interface {
    Foo()
}

type B struct {
    a Fooer
}

func (b *B) Bar() {
    b.a.Foo()
}

func main() {
    var a A
    var b B
    b.a = &a
    b.Bar()
}

// in your test:

type mockFooer struct {
    fooCalls int
}

func (f *mockFooer) Foo() {
    f.fooCalls++
}

func Test(t *testing.T) {
    var mock mockFooer
    var bUnderTest B
    bUnderTest.a = &mock
    bUnderTest.Bar()
    if mock.fooCalls != 1 {
        t.Error("Foo not called")
    }
}