BaggageField updateValue 方法 returns 在 jUnit 测试中为 false

BaggageField updateValue method returns false in jUnit tests

编辑:一个问题是 Tracing.current() 为空。我用新的 @BeforeEach 而不是旧的 @BeforeTestMethod:

解决了这个问题
Tracer tracer;

@BeforeEach
void init() {
    tracer = Tracing.newBuilder().build().tracer();
    TraceContext ctx = TraceContext.newBuilder().traceId(17).spanId(17).build();
    Span span = tracer.toSpan(ctx);
    tracer.withSpanInScope(span);
}

然而,updateValue 仍然不起作用,因为上下文中没有额外内容,所以没有什么可更新的...


按照 中的想法,我正在尝试在我的一项测试中使用 BaggageFields。所有对象都不为空,但 updateValue returns 为 false,测试失败 BaggageTest.baggageTest:40 expected: <hello> but was: <null>。如前所述,我不知道为什么 updateValue 方法不起作用。

import static org.junit.jupiter.api.Assertions.assertEquals;

import brave.baggage.BaggageField;
import brave.baggage.CorrelationScopeConfig;
import brave.context.slf4j.MDCScopeDecorator;
import brave.propagation.CurrentTraceContext;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.ScopedSpan;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.event.annotation.BeforeTestMethod;
import org.springframework.test.context.junit.jupiter.SpringExtension;

@Slf4j
@ExtendWith(SpringExtension.class)
@ContextConfiguration
public class BaggageTest {

    @Autowired
    ApplicationContext context;
    
    @BeforeTestMethod
    void init() {
        Tracer tracer = context.getBean(Tracer.class);
        ScopedSpan span = tracer.startScopedSpan("test");
    }

    @Test
    void baggageTest() {
        BaggageField fooBar = context.getBean("fooBar", BaggageField.class);
        log.info("updateValue {}", fooBar.updateValue("hello"));
        assertEquals("hello", fooBar.getValue());
    }

    @Configuration
    static class Config {

        private BaggageField findOrCreate(String name) {
            BaggageField field = BaggageField.getByName(name);
            if (field == null) {
                field = BaggageField.create(name);
            }
            return field;
        }

        @Bean("fooBar")
        BaggageField fooBar() {
            return findOrCreate("fooBar");
        }

        @Bean
        CurrentTraceContext.ScopeDecorator mdcScopeDecorator() {
            return MDCScopeDecorator.newBuilder()
                .clear()
                .add(CorrelationScopeConfig.SingleCorrelationField.newBuilder(fooBar())
                    .flushOnUpdate()
                    .build())
                .build();
        }
    }
}

我的解决方案是使用以下代码段手动构建 TraceContext,注意 BaggageFieldsbrave.internal.baggage.BaggageFields.

@Autowired
BaggageField field;

Tracer tracer;

@BeforeEach
void init() {
    tracer = Tracing.newBuilder().build().tracer();
    ArrayList<BaggageField> list = new ArrayList<>();
    list.add(field);
    TraceContext ctx = TraceContext.newBuilder()
        .addExtra(BaggageFields.newFactory(list,2).create())
        .traceId(17).spanId(17).build();
    Span span = tracer.toSpan(ctx);
    tracer.withSpanInScope(span);
}