使用Golang进行单元测试:gocb实现Couchbase Mocking最佳实践
使用Golang进行单元测试:gocb实现Couchbase Mocking最佳实践 我正在当前Go项目中使用以下Couchbase包: “gopkg.in/couchbase/gocb.v1”
type DbRepository interface {
Insert(item *entity.SampleEntity) error
}
//repository_couchbase.go
cbConnStr = config.Viper.GetString(
“database.couchbase.connectionstring”)
cbBucket = config.Viper.GetString(
“database.couchbase.bucket”)
)
type CbRepository struct {
Cluster *gocb.Cluster
Bucket *gocb.Bucket
}
func NewCbRepository() *CbRepository {
logger.BootstrapLogger.Debug(“Entering Repository.NewCbRepository() …”)
cluster, err := gocb.Connect(cbConnStr)
if err != nil {
logger.BootstrapLogger.Error(err)
panic(err)
}
cluster.Authenticate(gocb.PasswordAuthenticator{
Username: config.Viper.GetString("database.couchbase.username"),
Password: config.Viper.GetString("database.couchbase.password"),
})
bucket, err := cluster.OpenBucket(cbBucket, "")
if err != nil {
logger.BootstrapLogger.Error(err)
panic(err)
}
return &CbRepository{
Cluster: cluster,
Bucket: bucket,
}
}
func (r CbRepository) Insert(item entity.Favorite) error {
logger.Logger.Debug(“Entering CbRepository.Insert() …”)
_, err := r.Bucket.Insert(“DocumentName”, item, 0)
if err != nil {
logger.Logger.Error(err)
switch err {
/
* Include -case gocb.Err**- to handle Couchbase error types here as required.
* Fallback to default if none match
*/
case gocb.ErrTimeout:
return entity.ErrDatabaseFailure
case gocb.ErrKeyExists:
return entity.ErrItemExists
default:
return entity.ErrDefault
}
}
return nil
}
注意:存储库可以有多种类型,比如Couchbase或AWS Documentdb。这就是为什么我为repositoryCb单独实现的原因。
这个Couchbase包不是基于接口设计的,那么我该如何模拟数据库请求? r.Bucket.Insert() — r.Bucket.Upsert() 等
我的程序结构如下:
- Main > Handler > Service层 > repositoryCb > repository
使用mockGen, 我已在服务层模拟了存储库接口。 在处理器层模拟了服务层。
我的问题是如何模拟核心CRUD操作,比如bucket.Insert()、bucket.Upsert()、bucket.Get()等。
请分享您的想法。
更多关于使用Golang进行单元测试:gocb实现Couchbase Mocking最佳实践的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复


