【问题标题】:Can't mock struct for testing无法模拟结构进行测试
【发布时间】:2023-03-18 15:20:01
【问题描述】:

试图模拟结构进行测试。但是下面的代码有错误:

./test.go:32:17: cannot use NewClass() (type *Class) as type mockClass in return argument:
    *Class does not implement mockClass (wrong type for Query method)
        have Query() *Iterator
        want Query() mockIterator

为什么我不能这样做?

func NewClass() *Class {
    return &Class{}
}

type Class struct{}

func (Class) Query() *Iterator {
    return &Iterator{}
}

type Iterator struct{}

func (Iterator) Next() error {
    return nil
}

type mockClass interface {
    Query() mockIterator
}

type mockIterator interface {
    Next() error
}

var newMock = func() mockClass {
    return NewClass()
}

在测试中我想分配给newMock 类似的东西:

newMock = funcr() mockClass {
    return &fakeClass{}
}

结构 ClassIterator 不在我的控制之下。这些结构来自外部库。

【问题讨论】:

  • “为什么我不能这样做?” 对于实现接口的类型,其方法必须与接口的方法匹配逐字 . Query() *IteratorQuery() mockIterator 不匹配,即使*Iterator 类型实现了mockIterator 接口也没关系,这两个方法根本不一样,因此Class 不实现 mockClass.

标签: go


【解决方案1】:
  1. 创建一个接口来表达您的组件需要的业务逻辑。不要使用任何第 3 方类型。
  2. 在您的业务逻辑中使用该接口。
  3. 创建一个封装第三方库的接口实现,并将其传递给main.go 中的组件,这是连接/注入各种系统组件的好地方。

这样,如果有一天您决定不使用这个第 3 方库,您可以轻松地模拟 您的 界面并更改另一个实现。

如果由于某种原因您被绑定到此库并且无法创建不引用第 3 方类型的接口,请查看Can I mock out library code with a nested interface?

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多