应用 mock 对象和反射可以在 go 框架中检测私有方法:建立模拟目标接口 mock 目标,应用 mockery 库形成。应用反射浏览私有方法,根据 methodbyname 获得 method 值并通过 call 启用。设定 mock 目标的期待行为,认证启用是否符合预期。
怎样在 Go 框架中应用 Mocking 对私有方法开展单元测试在编写单元测试时,可能需要检测私有方法,这个方法往往被架构或第三方库掩藏。Go 语言提供了一种应用 mock 对象和反射去解决该问题的高雅方式。
应用 Mock 目标为了模拟私有方法,我们应该创建一个 mock 目标,它达到目标插口并提供特定方式的自定义完成。我们可以使用流行的 [mockery](https://github.com/vektra/mockery) 库轻松生成 mock 目标:
mockery--name=MyMock --inpkg--dirpkgmypackage--outputmock
这将在 mock 子目录中创建一个包括 MyMock 类别的文档。MyMock 完成我们希望模拟的接口。
浏览私有方法我们可以使用反射来访问私有方法。反射允许我们根据种类反射查看对象构造,包括它的方法与字段。
比如,假定我们有一个包括私有方法 doSomething 的 MyService 种类:
type MyService struct{}
func(sMyService)doSomething(){}
要浏览这一私有方法,我们可以使用 reflect.Value 种类:
funcTestMyService_PublicMethod(ttesting.T){
service:=&MyService{}
serviceValue:=reflect.ValueOf(service)
doSomethingMethod:=serviceValue.MethodByName("doSomething")
doSomethingMethod.Call([]reflect.Value{})
}
根据启用 MethodByName,大家可以获得私有方法的 reflect.Method 值。随后,我们通过启用 Call 来启用它,传送一切必需的参数。
实战案例 假定我们有一个 MyService 种类,它接受一个插口做为参数并启用其 DoSomething 方式。以下是应用 mocking 并对私有方法进行检测的实例:
packagemypackage
import(
"reflect"
"testing"
"github.com/golang/mock/gomock"
)
typeMyInterfaceinterface{
DoSomething()
}
type MyService struct{
depMyInterface
}
func(sMyService)DoSomethingElse(){
s.dep.DoSomething()
}
funcTestMyService_DoSomethingElse(ttesting.T){
ctrl:=gomock.NewController(t)
deferctrl.Finish()
mockDep:=mock_MyInterface(ctrl)
//设定 mock 方式的期待行为
mockDep.EXPECT().DoSomething().Times(1)
service:=&MyService{
dep:mockDep,
}
service.DoSomethingElse()
//认证 mock 方式的行为是否符合预期
if!ctrl.ExpectationsWereMet(){
t.Error("mockexpectationswerenotmet")
}
}
根据使用 mock 对象和反射的组成,大家可以有效的对架构或第三方库中不能访问的私有方法开展单元测试,进而提升测试覆盖率以确保编码的准确性。
以上就是怎样在golang框架中应用 mocking 对私有方法开展单元测试?的详细内容,大量请关注其他类似文章!