Go单元测试能否定义不同返回类型?能否让want字段自动推断类型?
Go单元测试问题解答
1. 能不能在Go单元测试里定义不同的返回类型?
Go普通函数不支持重载,所以被测函数没法直接根据输入返回不同类型。要实现类似逻辑,常用两种方式:
- 用泛型(Go 1.18+):给被测函数加泛型约束,让它返回符合约束的类型。
- 用
interface{}空接口:返回空接口后在调用方做类型断言,但这种方式丢失类型安全性,新代码尽量少用。
至于单元测试本身的TestXxx函数,返回类型是固定的——要么无返回值,要么返回error(Go 1.13+支持),没法定义不同返回类型。
2. 测试用例结构体的want字段能不能用type1 | type2这种联合类型?
Go现在不支持直接把type1 | type2作为结构体字段类型。要实现类似需求,有几个替代思路:
- 泛型测试用例:定义泛型结构体,用联合类型做约束,示例:
type TestCase[T type1 | type2] struct { in int want T } // 针对type1的测试用例 var type1Tests = []TestCase[type1]{ {1, type1{}}, } // 针对type2的测试用例 var type2Tests = []TestCase[type2]{ {3, type2{}}, }
- 接口类型:如果
type1和type2有共同方法,定义一个包含这些方法的接口,把want设为该接口类型。要是没共同方法,也能用interface{},但得在测试里做类型断言判断。 - 拆分测试用例:把不同返回类型的测试用例分开,各自编写对应测试逻辑。
你提到的相关讨论标题翻译为:《根据参数返回不同类型的可选方案》
内容的提问来源于stack exchange,提问作者Francisco B Sanchez
相关产品推荐
相关产品推荐

