【问题标题】:Error with Zipkin in unit test (cannot mock Span.baggageItems)单元测试中 Zipkin 出错(无法模拟 Span.baggageItems)
【发布时间】:2017-07-10 12:39:25
【问题描述】:

当我尝试在我的 Spring Boot 应用程序中运行 unitTest 时出现此错误。

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-dependencies 时,我只会收到此错误:

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

但是如果我使用这个以前的版本:

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

一切正常

为了避免最新版本出现此错误,我该怎么做?

单元测试扩展了这个类以模拟 SpanAccessor

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();
}

}

【问题讨论】:

  • 所以它只对单元测试失败?你能告诉我你的单元测试吗?
  • 看看 AbstractSpanAccessorTest.class

标签: spring spring-cloud spring-cloud-config


【解决方案1】:

你为什么要嘲笑一个跨度?这完全没有意义。 Span 也永远不是 bean。您已经通过构建器创建了一个正常的跨度,您应该离开它。假设你已经设置了 Boot context 属性并且你想模拟出tracer bean,你应该执行以下操作

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();
}
}

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 2014-04-16
    • 2018-06-16
    • 2015-10-21
    • 1970-01-01
    • 2019-12-13
    • 2019-07-04
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多