2017-07-10 29 views
0

我收到此错误,当我尝试在我的春季启动应用程序中运行unitTest。错误与单元测试Zipkin(不能模拟Span.baggageItems)

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> 

一切正常,如我所料

我能做些什么才能避免上次版本出现此错误?

单元测试是为了嘲笑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(); 
} 

}

+0

所以它不仅不能为单元测试?你能告诉我你的单元测试吗? –

+0

查看AbstractSpanAccessorTest.class –

回答

1

你为什么要嘲笑的跨度延伸这个类?这绝对没有意义。 Span也永远不是一个bean。你已经通过一个建造者创建了一个正常的跨度,你应该离开它。假设你已经设置了引导上下文属性,你想模拟出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(); 
} 
} 
+0

非常感谢!现在工作正常。你是对的,我的错误在这里... –