gpt4 book ai didi

go - 测试返回接口(interface)的函数

转载 作者:IT王子 更新时间:2023-10-29 02:06:49 27 4
gpt4 key购买 nike

我在为下面的案例编写测试时遇到困难。

我能够使用仅实现我自己使用的功能的模拟对象为“助手”编写测试。

如何在不模拟函数 C()、D() 的情况下使用模拟对象为函数“new”编写测试代码?

可能是其他包写得不好,它不应该返回一个接口(interface)而是实际的结构?

package main

import (
"fmt"
)

func main() {
New()
}

func New() {
new(NewFromEnvironment)
}

type newTopology func()(Interface,error)

// new is non-exposed simply used for testing purpose.
func new(newTopology newTopology) {
t,_ := newTopology()
helper(t)
}

// I need to call only A and B
type topologyInterface interface {
A() string
B() string
}

func helper(topology topologyInterface) {
s1 := topology.A()
s2 := topology.B()
fmt.Println(s1 + "," + s2)
}

// Below are from other package named "topology".
// I have no control to the code below.

type Interface interface {
A() string
B() string
C() string
D() string
//... more
}

func NewFromEnvironment() (Interface, error) {
return P{}, nil
}

type P struct{}

func (p P) A() string {
return "A"
}

func (p P) B() string {
return "B"
}

func (p P) C() string {
return "C"
}

func (p P) D() string {
return "D"
}

// more...

最佳答案

您可以尝试创建一个嵌入 P 的结构 MockP。然后MockP继承了P的所有方法,但是你可以用你的shadow A()B()自己的模拟实现。这是一个例子:

package main

import (
"fmt"
)

type Interface interface {
A()
B()
}

type P struct {
}

func (p P) A() {
fmt.Println("A")
}


func (p P) B() {
fmt.Println("B")
}

type MockP struct {
P
}

// Shadow P's B() method
func (p MockP) B() {
fmt.Println("Mock B")
}

func main() {
var p Interface = MockP{}
p.A()
p.B()
}

输出:

A
Mock B

关于go - 测试返回接口(interface)的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56369383/

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