如何测试使用activity.GetLogger(ctx)的Temporal代码?
如何在测试中获取合法的Temporal活动上下文?
问题场景
我有一个Temporal活动函数:
func logSomething(ctx context.Context) { log := activity.GetLogger(ctx) log.Info("logging something") }
直接用logSomething(context.Background())测试调用时,会触发panic:
test panicked: getActivityOutboundInterceptor: Not an activity context
我尝试通过自定义拦截器注入上下文,但用字符串"activityInterceptor"作为ContextKey无法匹配内部的activityInterceptorContextKey,问题依旧,使用的是temporalio sdk-go v1.17.0版本。
解决方法
方法1:用官方测试套件构造上下文(推荐)
temporalio官方的activity/testsuite包提供了专门的测试工具,能直接生成合法的活动上下文,自动注入Logger等依赖:
import ( "testing" "github.com/temporalio/sdk-go/activity" "github.com/temporalio/sdk-go/activity/testsuite" ) func TestLogSomething(t *testing.T) { suite := &testsuite.ActivityTestSuite{} ctx, _ := suite.NewActivityContext(t, nil) // 现在可正常调用目标函数 logSomething(ctx) }
方法2:反射获取内部ContextKey(不推荐)
如果不想依赖测试套件,可以通过反射拿到未导出的activityInterceptorContextKey,再注入自定义拦截器:
import ( "context" "reflect" "github.com/temporalio/sdk-go/activity" "github.com/temporalio/sdk-go/interceptor" "github.com/temporalio/sdk-go/log" ) // 自定义拦截器实现Logger方法 type fakeActivityOutboundInterceptor struct { interceptor.ActivityOutboundInterceptorBase } func (f *fakeActivityOutboundInterceptor) GetLogger(_ context.Context) log.Logger { // 返回自定义Logger实例,这里用默认示例 return log.NewDefaultLogger() } func TestLogSomething(t *testing.T) { // 反射获取内部未导出的contextKey var activityInterceptorKey interface{} internalActivityPkg := reflect.TypeOf(activity.GetLogger).PkgPath() // 定位内部包的contextKey字段 internalType, _ := reflect.ValueOf(&struct{}{}).Type().Elem().FieldByName("activityInterceptorContextKey") if internalType.IsValid() { activityInterceptorKey = internalType.Interface() } // 构造合法上下文 ctx := context.WithValue( context.Background(), activityInterceptorKey, &fakeActivityOutboundInterceptor{}, ) logSomething(ctx) }
⚠️ 注意:这种方法依赖SDK内部实现,版本更新可能失效,优先用官方测试套件。
内容的提问来源于stack exchange,提问作者Zoltán
相关产品推荐
相关产品推荐

