/ / Fehler mit Zipkin im Komponententest (kann Span.baggageItems nicht nachahmen)

Fehler mit Zipkin im Komponententest (Spain.baggageItems kann nicht simuliert werden) - spring, spring-cloud, spring-cloud-config

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 № 1

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