3

我正在使用gomock(源模式)并希望模拟一段看起来像这样的代码:

type foo interface {
  MethodA() int
}

type Boo interface {
  MethodB(f foo) string
}

其中未导出的foo接口用作MethodB(). 使用 mockgen 后,mockedMethodB()看起来像:

func (m &MockBoo) MethodB(f foo) string { ... }

这是错误的,因为foo未导出且无法访问。

想知道是否有办法解决它(例如,foo代替Mockfoo作为论点)?

PS。我也尝试了 gomockreflect模式,但它有同样的问题。

4

1 回答 1

0

要测试私有类型,请在与该类型相同的包中声明您的测试。这样做将允许您访问私有符号。


例子

测试

package foo
import (
    "testing"

    "github.com/golang/mock/gomock"
)
func TestName(t *testing.T) {
    con := gomock.NewController(t)
    defer con.Finish()
    boo := NewMockBoo(con)
    var F foo
    boo.EXPECT().MethodB(F)
    if len(boo.MethodB(F)) > 0 {
        t.Fail()
    }
}

生成模拟

$ mockgen -source=foo.go -package foo -destination foo_mock.go

foo.go

package foo


type foo interface {
  MethodA() int
}

type Boo interface {
  MethodB(f foo) string
}

运行测试:

$ go test  -v 
=== RUN   TestName
--- PASS: TestName (0.00s)
PASS
ok      foo 0.001s
于 2021-10-25T11:51:29.910 回答