Go中通过errors.Is和errors.As实现安全的错误比较与类型提取;2. 针对自定义错误类型可验证结构字段;3. 利用接口模拟依赖错误以测试调用方逻辑,确保错误处理正确。

在 Go 语言开发中,函数返回错误(error)是处理异常情况的标准方式。为了保证程序的健壮性,对错误路径进行充分测试至关重要。本文介绍如何在 Golang 中有效测试错误返回,确保你的代码在出错时依然表现正确。
Go 中的 error 是一个接口类型:
type error interface {
Error() string
}这意味着你可以通过比较错误消息、使用自定义错误类型或调用特定方法来判断错误是否符合预期。
Go 1.13 引入了 errors.Is 和 errors.As,让错误判断更安全、更清晰。
立即学习“go语言免费学习笔记(深入)”;
假设你有一个函数可能返回预定义错误:
var ErrNotFound = errors.New("not found")
func FindUser(id int) (*User, error) {
if id < 0 {
return nil, ErrNotFound
}
// ...
}对应的测试可以这样写:
func TestFindUser_ErrorWhenInvalidID(t *testing.T) {
_, err := FindUser(-1)
if !errors.Is(err, ErrNotFound) {
t.Fatalf("expected ErrNotFound, got %v", err)
}
}errors.Is 能正确处理封装过的错误(如使用 wrap),比直接比较更可靠。
有些错误携带额外信息,比如 HTTP 状态码或字段名。这时可以用 errors.As 提取具体类型。
例如:
type ValidationError struct {
Field string
}
func (e *ValidationError) Error() string {
return fmt.Sprintf("invalid field: %s", e.Field)
}
func ValidateEmail(email string) error {
if email == "" {
return &ValidationError{Field: "email"}
}
return nil
}测试时提取错误类型并验证字段:
func TestValidateEmail_Empty_ReturnsValidationError(t *testing.T) {
err := ValidateEmail("")
var ve *ValidationError
if !errors.As(err, &ve) {
t.Fatal("expected ValidationError")
}
if ve.Field != "email" {
t.Errorf("expected field 'email', got %s", ve.Field)
}
}在单元测试中,常需模拟依赖返回错误。可以通过接口注入或函数变量实现。
例如,使用接口:
type DB interface {
GetUser(int) (*User, error)
}
func ServiceGetUser(db DB, id int) (*User, error) {
user, err := db.GetUser(id)
if err != nil {
return nil, fmt.Errorf("service error: %w", err)
}
return user, nil
}测试时传入模拟对象:
type MockDB struct {
err error
}
func (m *MockDB) GetUser(int) (*User, error) {
return nil, m.err
}
func TestServiceGetUser_DBError_ReturnsWrappedError(t *testing.T) {
mockDB := &MockDB{err: ErrNotFound}
_, err := ServiceGetUser(mockDB, 1)
if !errors.Is(err, ErrNotFound) {
t.Fatalf("expected wrapped ErrNotFound")
}
}以上就是如何在Golang中测试错误返回_Golang 错误返回测试实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号