代码之家  ›  专栏  ›  技术社区  ›  Francisco José Martínez Páez

单元测试中Zipkin出错(无法模拟Span.baggageItems)

  •  0
  • Francisco José Martínez Páez  · 技术社区  · 7 年前

    java.lang.NullPointerException: null
    at org.springframework.cloud.sleuth.Span.baggageItems(Span.java:381)
    at org.springframework.cloud.sleuth.instrument.web.ZipkinHttpSpanInjector.inject(ZipkinHttpSpanInjector.java:27)
    at org.springframework.cloud.sleuth.instrument.web.ZipkinHttpSpanInjector.inject(ZipkinHttpSpanInjector.java:15)
    at org.springframework.cloud.sleuth.instrument.web.client.AbstractTraceHttpRequestInterceptor.publishStartEvent(AbstractTraceHttpRequestInterceptor.java:60)
    at org.springframework.cloud.sleuth.instrument.web.client.TraceRestTemplateInterceptor.intercept(TraceRestTemplateInterceptor.java:52)
    at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:86)
    

    我注意到,我只在使用此版本进行

    <spring-cloud.version>Dalston.RELEASE</spring-cloud.version>
    

    但如果我使用之前的版本:

    <spring-cloud.version>Camden.SR6</spring-cloud.version>
    

    为了避免上一版本出现此错误,我可以做些什么?

    单元测试扩展了这个类,以模拟span访问器

    public class AbstractSpanAccessorTest {
    
    @MockBean
    private Tracer tracer;
    
    @MockBean
    private Span span;
    
    private Random random = new Random();
    
    @Before
    public void mockSpan() {
        long id = createId();
        Span spanMock = Span.builder().name("mock").traceId(id).spanId(id).build();
        doReturn(spanMock.traceIdString()).when(span).traceIdString();
        doReturn(span).when(tracer).getCurrentSpan();
        doReturn(span).when(tracer).createSpan(anyString());
    }
    
    private long createId() {
        return random.nextLong();
    }
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   Marcin Grzejszczak    7 年前

    你为什么要嘲笑斯潘?这完全没有道理。而且跨度永远不是豆子。你已经通过一个生成器创建了一个正常的跨度,你应该离开它。假设您已经设置了引导上下文属性,并且想要模拟 tracer

    public class AbstractSpanAccessorTest {
    @MockBean
    private Tracer tracer;
    
    private Random random = new Random();
    
    @Before
    public void mockSpan() {
      long id = createId();
      Span spanMock = Span.builder().name("mock").traceId(id).spanId(id).build();
      doReturn(spanMock).when(tracer).getCurrentSpan();
      doReturn(spanMock).when(tracer).createSpan(anyString());
    }
    
    private long createId() {
      return random.nextLong();
    }
    }