You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Go语言服务的Run函数编写错误场景单元测试用例

针对Run函数错误场景的单元测试实现

核心思路

你代码里已经将service.New封装为全局变量serviceNew,这为mock服务实例提供了便利。我们可以在测试中替换这个变量,返回一个自定义的service.Service实现,让它的Run方法返回预设错误,以此模拟s.Run()失败的场景,验证StartService是否正确捕获并返回该错误。

具体实现

1. 定义Mock服务结构体

实现service.Service接口,只需要让Run方法返回预设错误,其他接口方法做空实现即可:

type MockService struct {
    runError error
}

// 模拟Run方法返回错误
func (m *MockService) Run() error {
    return m.runError
}

// 实现接口其他必要方法(根据service.Service的定义补充)
func (m *MockService) String() string { return "mock-agent-service" }
func (m *MockService) Start() error   { return nil }
func (m *MockService) Stop() error    { return nil }
// 若service.Service还有其他方法,需补充空实现或按需编写

2. 编写测试用例

在测试中替换serviceNew,调用StartService并验证错误:

import (
    "errors"
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestStartService_RunFailed(t *testing.T) {
    // 保存原变量,测试结束后恢复,避免影响其他测试
    originalServiceNew := serviceNew
    defer func() { serviceNew = originalServiceNew }()

    // 预设Run方法要返回的错误
    testErr := errors.New("service run failed")

    // 替换serviceNew为mock构造函数
    serviceNew = func(_ interface{}, _ *service.Config) (service.Service, error) {
        return &MockService{runError: testErr}, nil
    }

    // 执行待测试函数
    err := StartService()

    // 验证错误是否正确传递
    assert.Equal(t, testErr, err)
}

关键要点

  • 全局变量恢复:测试结束后必须恢复serviceNew的原始值,否则会破坏其他测试用例的执行环境。
  • 接口完整性:MockService必须完整实现service.Service的所有方法,否则会编译失败。非核心方法可以写空实现。
  • 错误验证:使用断言库(如testify)能更简洁地验证结果,也可以直接用if err != testErr进行判断。

内容的提问来源于stack exchange,提问作者vk_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:42:45