zvvq技术分享网

如何在 golang 框架中使用 mocking 对私有方法进行单

作者:zvvq博客网
导读使用 mock 对象和反射可以在 go 框架中测试私有方法:创建模拟目标接口的 mock 对象,使用 mockery 库生成。使用反射访问私有方法,通过 methodbyname 获取 method 值并通过 call 调用。设置

应用 mock 对象和反射可以在 go 框架中检测私有方法:建立模拟目标接口 mock 目标,应用 mockery 库形成。应用反射浏览私有方法,根据 methodbyname 获得 method 值并通过 call 启用。设定 mock 目标的期待行为,认证启用是否符合预期。

内容来自zvvq,别采集哟

zvvq

怎样在 Go 框架中应用 Mocking 对私有方法开展单元测试在编写单元测试时,可能需要检测私有方法,这个方法往往被架构或第三方库掩藏。Go 语言提供了一种应用 mock 对象和反射去解决该问题的高雅方式。 zvvq好,好zvvq

应用 Mock 目标为了模拟私有方法,我们应该创建一个 mock 目标,它达到目标插口并提供特定方式的自定义完成。我们可以使用流行的 [mockery](https://github.com/vektra/mockery) 库轻松生成 mock 目标:

内容来自samhan666

mockery--name=MyMock --inpkg--dirpkgmypackage--outputmock 内容来自samhan

这将在 mock 子目录中创建一个包括 MyMock 类别的文档。MyMock 完成我们希望模拟的接口。

本文来自zvvq

浏览私有方法我们可以使用反射来访问私有方法。反射允许我们根据种类反射查看对象构造,包括它的方法与字段。

copyright zvvq

比如,假定我们有一个包括私有方法 doSomething 的 MyService 种类:

内容来自zvvq

type MyService struct{}

内容来自zvvq,别采集哟

func(sMyService)doSomething(){} zvvq好,好zvvq

要浏览这一私有方法,我们可以使用 reflect.Value 种类:

zvvq.cn

funcTestMyService_PublicMethod(ttesting.T){ 内容来自zvvq

service:=&MyService{}

zvvq.cn

serviceValue:=reflect.ValueOf(service) zvvq

doSomethingMethod:=serviceValue.MethodByName("doSomething")

内容来自zvvq,别采集哟

doSomethingMethod.Call([]reflect.Value{}) 内容来自zvvq,别采集哟

} zvvq好,好zvvq

根据启用 MethodByName,大家可以获得私有方法的 reflect.Method 值。随后,我们通过启用 Call 来启用它,传送一切必需的参数。

内容来自zvvq

实战案例假定我们有一个 MyService 种类,它接受一个插口做为参数并启用其 DoSomething 方式。以下是应用 mocking 并对私有方法进行检测的实例:

zvvq.cn

packagemypackage

内容来自zvvq

import( 内容来自samhan

"reflect" copyright zvvq

"testing"

内容来自samhan666

"github.com/golang/mock/gomock" zvvq

) zvvq.cn

typeMyInterfaceinterface{ copyright zvvq

DoSomething()

copyright zvvq

}

内容来自samhan666

type MyService struct{

内容来自samhan666

depMyInterface 本文来自zvvq

} zvvq好,好zvvq

func(sMyService)DoSomethingElse(){ copyright zvvq

s.dep.DoSomething() copyright zvvq

}

copyright zvvq

funcTestMyService_DoSomethingElse(ttesting.T){ 内容来自samhan

ctrl:=gomock.NewController(t) 内容来自zvvq,别采集哟

deferctrl.Finish() copyright zvvq

mockDep:=mock_MyInterface(ctrl)

内容来自samhan666

//设定 mock 方式的期待行为

zvvq

mockDep.EXPECT().DoSomething().Times(1) zvvq

service:=&MyService{ 内容来自samhan

dep:mockDep, 内容来自samhan666

} 内容来自zvvq

service.DoSomethingElse() 本文来自zvvq

//认证 mock 方式的行为是否符合预期

内容来自zvvq,别采集哟

if!ctrl.ExpectationsWereMet(){

内容来自samhan

t.Error("mockexpectationswerenotmet") 本文来自zvvq

}

内容来自zvvq

}

zvvq.cn

根据使用 mock 对象和反射的组成,大家可以有效的对架构或第三方库中不能访问的私有方法开展单元测试,进而提升测试覆盖率以确保编码的准确性。 内容来自zvvq,别采集哟

以上就是怎样在golang框架中应用 mocking 对私有方法开展单元测试?的详细内容,大量请关注其他类似文章!

内容来自samhan