spring 当我尝试在单元测试中模拟 sleuth 时云失败
spring cloud is failing when I try to mock sleuth in unit tests
如果我使用 Dalston.SR3 或 Dalston.Release 版本,当我尝试在单元测试中模拟 Tracer 和 Span 等对象时遇到一些错误,但如果我使用 Camden.SR6 则不会发生此问题或 Camden.SR7 版本。
查找示例代码here
微服务 msvc-a 正在使用 Dalston 版本并且有两个测试 classes,其中只有我试图模拟的 class 失败Tracer 和 Span 对象。
微服务 msvc-b 正在使用 Camden 版本并且具有相同的测试 classes.
同时,当我在STS中处于调试模式时,我无法理解这种情况以及为什么我看不到任何错误跟踪或类似的东西......只有一个NullpointerException。
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 的正确方法是:
@Before
public void mockSpan() {
long id = createId();
span = Span.builder().name("mock").traceId(id).spanId(id).build();
doReturn(span).when(tracer).getCurrentSpan();
doReturn(span).when(tracer).createSpan(anyString());
}
Tracer 根本不会用 Finchley.SR2 进行模拟,所以我最终得到了这个:
Tracing tracing = Tracing.newBuilder().build();
Tracer tracer = tracing.tracer();
如果我使用 Dalston.SR3 或 Dalston.Release 版本,当我尝试在单元测试中模拟 Tracer 和 Span 等对象时遇到一些错误,但如果我使用 Camden.SR6 则不会发生此问题或 Camden.SR7 版本。
查找示例代码here
微服务 msvc-a 正在使用 Dalston 版本并且有两个测试 classes,其中只有我试图模拟的 class 失败Tracer 和 Span 对象。
微服务 msvc-b 正在使用 Camden 版本并且具有相同的测试 classes.
同时,当我在STS中处于调试模式时,我无法理解这种情况以及为什么我看不到任何错误跟踪或类似的东西......只有一个NullpointerException。
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 的正确方法是:
@Before
public void mockSpan() {
long id = createId();
span = Span.builder().name("mock").traceId(id).spanId(id).build();
doReturn(span).when(tracer).getCurrentSpan();
doReturn(span).when(tracer).createSpan(anyString());
}
Tracer 根本不会用 Finchley.SR2 进行模拟,所以我最终得到了这个:
Tracing tracing = Tracing.newBuilder().build();
Tracer tracer = tracing.tracer();