Ich erhalte diese Fehlermeldung, wenn ich versuche, den unitTest in meiner Spring Boot-Anwendung auszuführen.
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)
Ich stelle fest, dass ich diesen Fehler nur bekomme, wenn ich diese Version für benutze Frühlingswolken-Abhängigkeiten:
<spring-cloud.version>Dalston.RELEASE</spring-cloud.version>
aber wenn ich diese vorherige version verwende:
<spring-cloud.version>Camden.SR6</spring-cloud.version>
alles funktioniert wie ich es erwartet habe
Was kann ich tun, um diesen Fehler mit der letzten Version zu vermeiden?
Die Unit-Tests werden in dieser Klasse erweitert, um den SpanAccessor zu verspotten
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();
}
}
Antworten:
1 für die Antwort № 1Warum machen Sie eine Spanne? Das macht absolut keinen Sinn. Auch ein Span ist nie eine Bohne. Sie erstellen bereits eine normale Spanne über einen Builder, und Sie sollten dies verlassen. Angenommen, Sie haben die Boot-Kontexteigenschaft eingerichtet und möchten sie ausspucken tracer
Bean solltest du folgendes tun
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();
}
}