Gomock未返回预期值:Enabled方法返回true却被识别为false
问题分析与解决:Go语言gomock测试logr日志失败
你的问题出在Enabled方法的mock期望设置上:gomock的Do方法仅用于执行副作用逻辑,不会覆盖mock方法的返回值,默认会返回对应类型的零值(这里就是false)。所以即使你在Do里的逻辑返回了true,mock的Enabled()最终还是返回false,导致日志被过滤,Info("Foo")根本不会调用mock的Info方法,自然触发测试失败。
解决方法很简单,把Do替换为DoAndReturn方法,它既能执行自定义逻辑,又能将函数的返回值作为mock方法的返回值:
func TestLogging(t *testing.T) { ls := mock.NewMockLogSink(gomock.NewController(t)) ls.EXPECT().Init(gomock.Any()) const logLevel = 1 // 使用DoAndReturn替代Do,动态返回判断结果 ls.EXPECT().Enabled(gomock.Any()).AnyTimes().DoAndReturn(func(level int) bool { return level <= logLevel }) log.Set(logr.New(ls)) ls.EXPECT().Info(gomock.Any(), "Foo").Times(1) log.Info("Foo") ls.EXPECT().Info(gomock.Any(), "Bar").Times(0) log.V(2).Info("Bar") }
补充说明:
Do的核心作用是在mock方法被调用时执行一段额外逻辑(比如打印日志、修改外部变量),但不影响方法的返回值;DoAndReturn专门用于需要根据输入参数动态生成返回值的场景,完全匹配你这里需要根据日志级别判断是否启用的需求;- 你代码中
log.Set(logr.New(ls))的设置是正确的,不需要调整。
内容的提问来源于stack exchange,提问作者Shaul Behr
相关产品推荐
相关产品推荐

