【问题标题】:spring cloud is failing when I try to mock sleuth in unit tests当我尝试在单元测试中模拟侦探时,spring cloud 失败了
【发布时间】:2025-12-13 16:30:01
【问题描述】:

如果我使用 Dalston.SR3 或 Dalston.Release 版本,我尝试在单元测试中模拟 Tracer 和 Span 等对象时遇到一些错误,但如果我使用 Camden.SR6 或 Camden.SR7,则不会发生此问题版本。

查找示例代码here

微服务 msvc-a 正在使用 Dalston 版本并有两个测试类,其中只有我试图模拟 Tracer 和 Span 对象的类失败。

微服务 msvc-b 使用 Camden 版本,测试类相同。

同时,当我在 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();
    }
}

【问题讨论】:

  • 你能提供一个堆栈跟踪或某事吗?目前,您在屏幕截图中显示了由于响应不能为空而无法抛出 NPE 的情况。还有,你试图嘲笑侦探是什么意思?请显示您的测试并显示导致 NPE 被抛出的行。
  • 您好,上面有示例代码的链接 (github.com/fjmpaez911/spring-cloud-sleuth-error)。没有可用的跟踪,但您可以尝试为这两个微服务运行单元测试并查看发生了什么。在实际场景中,我需要模拟 Tracer 和 Span,因为我不想在单元测试中执行类似这样的代码时出现错误 (String traceIdString = spanAccessor.getCurrentSpan().traceIdString();)
  • 您好,我知道我拥有它,但您甚至没有编写如何运行或测试它。您没有指向任何课程等请提供我要求的详细信息。否则我将无法帮助您:/
  • 好的,抱歉。如果您运行测试(ServiceTest2.java 和 ServiceTest.java)类,您可能会遇到问题
  • 在查看代码时,这些测试是集成测试而不是单元测试。我也没有看到任何嘲笑。你能告诉我你在哪里模拟那个代码吗?

标签: spring unit-testing spring-boot spring-cloud spring-cloud-sleuth


【解决方案1】:

Tracer 根本不会用 Finchley.SR2 模拟,所以我最终得到了这个:

Tracing tracing = Tracing.newBuilder().build();
Tracer tracer = tracing.tracer();

【讨论】:

    【解决方案2】:

    这是我的错。模拟 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());
     }
    

    【讨论】: