php小编柚子为您带来了一篇关于如何使用Golang创建单元测试依赖注入的文章。在软件开发中,单元测试是至关重要的一部分,而依赖注入则是一种常用的设计模式,可以帮助我们更好地进行单元测试。本文将简明扼要地介绍如何使用Golang来实现依赖注入,以便我们能够更轻松地编写可测试的代码。让我们一起来探索吧!
问题内容
例如,我想创建一个用户API 具有这样的依赖注入结构
func Bootstrap(config *BootstrapConfig) {
// setup repositories
userRepository := repository.NewUserRepository(config.Log)
// setup producer
userProducer := messaging.NewUserProducer(config.Producer, config.Log)
// setup use cases
userUseCase := usecase.NewUserUseCase(config.DB, config.Log, config.Validate, userRepository, userProducer)
// setup controller
userController := http.NewUserController(userUseCase, config.Log)
routeConfig := route.RouteConfig{
App: config.App,
UserController: userController,
}
routeConfig.Setup()
}
然后,我想为用户创建 API 创建一个单元测试,但我不想与数据库进行真正的交互或模拟。由于 userUseCase 需要一个存储库,这意味着我们将为 SaveUserToDB 函数创建一个模拟 userRepository。
使用这样的方法正确吗?
mockRepo.On("SaveUserToDB", mock.Anything, mock.AnythingOfType("*repository.User")).Return(nil)
解决方法
依赖项注入需要实际注入依赖项。 Bootstrap
正在创建其依赖项,因此可以说这不是依赖项注入。如果你在测试中使用了 Bootstrap
,那么这绝对不是依赖注入。
所以你需要将 func Bootstrap(config *BootstrapConfig)
至少更改为 func Bootstrap(config *BootstrapConfig, userRepository *repository.User)
。
然后,在您的测试中,您将 mockRepo
传递给 Bootstrap
。
func Bootstrap(config *BootstrapConfig, userRepository *repository.User) {
// setup producer
userProducer := messaging.NewUserProducer(config.Producer, config.Log)
// setup use cases
userUseCase := usecase.NewUserUseCase(config.DB, config.Log, config.Validate, userRepository, userProducer)
// setup controller
userController := http.NewUserController(userUseCase, config.Log)
routeConfig := route.RouteConfig{
App: config.App,
UserController: userController,
}
routeConfig.Setup()
}
func TestFoo(t *testing.T) {
mockRepo := mocks.NewUserRepository(config.Log)
Bootstrap(config, mockRepo)
mockRepo.On("SaveUserToDB", mock.Anything).Return(nil)
…
}
Bootstrap
不应创建任何依赖项,因此您应该将其应用于 userProducer
、userUseCase
等
以上就是如何使用 Golang 创建单元测试依赖注入的详细内容,更多请关注编程网其它相关文章!