如何嘲笑GoLang的内在方法



例如

type test struct { // few fields}
func (t *test) createresource(res1 string,res2 string)error {
//doing some task
t.createsubresource(res1)
}
func (t *test)createsubresource(res1 string)error{
//perform some task
}

我想为createresource编写测试函数,如何模拟t.createsubsource(res1(调用。这是遗留代码,我没有权限修改上面的任何函数。

您的mock可以使用接口完成,例如:

main.go

package main
type TestInterface interface {
CreateResource(res1 string, res2 string) error
CreateSubresource (res1 string) error
}
func main() {
DoSomething(new(Test))   
}
func DoSomething(t TestInterface) {
t.CreateResource()
}

main_test.go

package main
import "testing"
type TestMock struct {}
func (tm *TestMock) CreateResource(res1 string, res2 string) error {
return nil
}
func (tm *TestMock) CreateSubresource(res1 string) error {
return nil
}
func TestDoSomething(t *testing.T) {
err := DoSomething(new(TestMock))
//... do your assertions
}

为什么它会这样工作

调用依赖于特定结构的函数不允许为其注入替代方案,这就是为什么需要创建使用接口的解决方案。通过拥有一个接口,只需实现一个与该接口匹配的新结构,并将其作为依赖项注入传递给将要测试的过程。

此外,请查看:

  • 默认情况下,没有简单的方法可以直接指向原始结构并告诉Go从中进行模拟。也许一些第三方lib可以做到(但我还没有看到(
  • 在go中,公共和私有声明由第一个大写字母定义。通过您的示例中的小写声明,我注意到一切都是私有的
  • 通常测试私有方法不是一个好的做法。关于这个话题有很多讨论,你可以在这里看看
  • 还有一些支持libs来进行断言和模拟,例如stretcher/verify,请先进行研究

我希望它能帮助你。

最新更新