Zipkin 在单元测试中出错(无法模拟 Span.baggageItems)
Error with Zipkin in unit test (cannot mock Span.baggageItems)
当我尝试 运行 我的 spring 启动应用程序中的 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
扩展了单元测试 class
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();
}
}
你为什么要嘲笑跨度?这完全没有意义。 Span 也永远不是 bean。您已经通过构建器创建了一个正常的跨度,您应该保留它。假设您已经设置了引导上下文 属性 并且您想要模拟 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();
}
}
当我尝试 运行 我的 spring 启动应用程序中的 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
扩展了单元测试 classpublic 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();
}
}
你为什么要嘲笑跨度?这完全没有意义。 Span 也永远不是 bean。您已经通过构建器创建了一个正常的跨度,您应该保留它。假设您已经设置了引导上下文 属性 并且您想要模拟 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();
}
}