@Test void build_headless() {
    Span s2 = Span.newBuilder().traceId("a").parentId("a").id("b").name("s2").build();
    Span s3 = Span.newBuilder().traceId("a").parentId("a").id("c").name("s3").build();
    Span s4 = Span.newBuilder().traceId("a").parentId("a").id("d").name("s4").build();

    SpanNode root = new SpanNode.Builder(logger).build(List.of(s2, s3, s4));

    assertThat(root.span()).isNull();
    assertThat(root.children()).extracting(SpanNode::span)
      .containsExactly(s2, s3, s4);
    assertThat(messages).containsExactly(
      "building trace tree: traceId=000000000000000a",
      "substituting dummy node for missing root span: traceId=000000000000000a"
    );
  }
Same as {@link #constructsTraceTree()}, except with shared span ID
zipkin/src/test/java/zipkin2/internal/SpanNodeTest.java