gpt4 book ai didi

unit-testing - 作为接口(interface)访问的单例的单元测试

转载 作者:行者123 更新时间:2023-12-01 22:23:39 25 4
gpt4 key购买 nike

我的应用程序中有一个单例,但它不是直接作为结构发布,而是作为接口(interface)发布(因为我希望能够在单例初始化时动态选择特定的实现)。这是代码:

var once sync.Once
var instance defaultConfiguration

type Configuration interface {
GetFoo() string
}

type defaultConfiguration struct {
}

func (dc defaultConfiguration) GetFoo() string {
return "foo"
}

func NewConfiguration() Configuration {
once.Do(func() {
instance = defaultConfiguration{}
})
return instance
}

然后我决定编写一个单元测试来检查 NewConfiguration()实际上每次都会返回相同的实例:
func TestNewConfigurationSameInstance(t *testing.T) {
configuration1 := NewConfiguration()
configuration2 := NewConfiguration()
if &configuration1 != &configuration2 {
t.Error()
}
}

我认为比较返回实例的地址是有意义的,但是,这个测试失败了。

然后我想,好吧,也许我必须返回一个指向实例的指针,所以我将代码更改为如下所示:
func NewConfiguration() *Configuration {
once.Do(func() {
instance = defaultConfiguration{}
})
return &instance
}

但这甚至无法编译:它失败并显示错误消息

cannot use &instance (type *defaultConfiguration) as type *Configuration in return argument: *Configuration is pointer to interface, not interface



我很困惑。为什么我不能返回指向接口(interface)的指针?或者,为什么要返回 defaultConfigurationConfiguration有效,但返回 *defaultConfiguration*Configuration不是?

毕竟,什么是适合我的用例的单元测试?

最佳答案

您的代码应该是:

var once sync.Once
var instance *defaultConfiguration

type Configuration interface {
GetFoo() string
}

type defaultConfiguration struct {
}

func (dc *defaultConfiguration) GetFoo() string {
return "foo"
}

func NewConfiguration() Configuration {
once.Do(func() {
instance = &defaultConfiguration{}
})
return instance
}

由于 Configuration是一个接口(interface),你想要一个指向 defaultConfiguration 的指针实现它。

很少需要指向接口(interface)的指针(例如 *Configuration )。一个接口(interface)已经是一个引用值,一个指向某种类型的指针来实现一个接口(interface)是完全没问题的。

有关根本问题的更多背景 read this answer或类似的资源。

关于unit-testing - 作为接口(interface)访问的单例的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61340476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com