Go 使用var声明来模拟结果的函数调用测试

Go 使用var声明来模拟结果的函数调用测试,go,Go,我正在测试一个函数,它调用了Go中的另一个函数。这就是我所拥有的 package b type b struct {...} func (b *b) functionB(){...} 我想修改b中的函数声明,如下所示: package b type b struct {...} var functionB = b.FuncInB func (b *b) FuncInB(){...} type B struct {...} 这样我就可以模拟a中函数b的返回。但是,我在a中得到错误消

我正在测试一个函数,它调用了Go中的另一个函数。这就是我所拥有的

package b

type b struct {...}

func (b *b) functionB(){...}
我想修改
b
中的函数声明,如下所示:

package b

type b struct {...}

var functionB = b.FuncInB

func (b *b) FuncInB(){...}
type B struct {...}

这样我就可以模拟a中
函数b
的返回。但是,我在a中得到错误消息,说
b.functionB
未定义,因为它应该是b对象的函数。如何实现这一点?

如果要在另一个包中使用一个包的定义,必须将其导出。这是通过让定义以大写字母开头来实现的。您的类型应定义如下:

package b

type b struct {...}

var functionB = b.FuncInB

func (b *b) FuncInB(){...}
type B struct {...}
不能通过函数的类型访问函数。这条线

var functionB = b.FuncInB
将不起作用,因为您只能从现有结构中引用函数。您应该删除这一行,并以不同的方式调用它(见下文)

您的包a现在有两个小问题。当您想从package
B
中使用struct
B
时,您必须像这样引用它
B.B

import "b"

b.B{...}
或对b包进行点导入:

import . "b"

B{...}
最后一件事是,在分配与包同名的变量时,要对包名进行阴影处理。在这种情况下,应使用不同的变量名:

func (a *a) functionA() {
    myB := b{...}
    myB.FunctionB()
    ...
}
因此,最终,您的软件包应该如下所示:

package b

type b struct {...}

var functionB = b.FuncInB

func (b *b) FuncInB(){...}
type B struct {...}
包b
B型结构{
// ...
}
func(b*b)FuncInB(){
// ...
}
a包
输入“b”
类型a结构{
// ...
}
func(a*a)函数(){
myB:=B{
// ...
}
myB.functionB()
// ...
}

您应该重新设计并停止嘲弄。您应该测试包b,并假设它在测试包a时工作正常,只需调用b的方法即可。mock是一种糟糕的技术,尤其是在Go中。@Volker我正在为我的函数创建单元测试,需要这样做。我看到另一篇关于模拟函数的帖子,它不可能从
a
调用
b.functionB
,无论它是函数还是方法,因为它不是。这就是我建议重新设计的原因,因为您不应该这样做。谢谢您的回复,但我的问题是关于在
b
中使用var的声明,欢迎使用。很难回答,因为你用一种非常抽象的方式陈述你的问题。如果你能提供更多你真正想要实现的细节,回答起来会更容易。