0

Ich habe einen laufenden Code mit Spring Boot und Feder Wolke mit sleuth, um die TraceId zu protokollieren. Allerdings habe ich Probleme bei dem Anruf einen Controller von anderen in den integrationTestIntegration Test sleuth mit restTemplate

public class TraceIdApp { 

    @Bean 
    public RestTemplate restTemplate() { 
     return new RestTemplate(); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(TraceIdApp.class, args); 
    } 

    } 

    @Slf4j 
    @Getter 
    @RestController 
    public class TraceIdController { 

    private SpanAccessor spanAccessor; 
    private RestTemplate restTemplate; 
    private String url; 

    @Autowired 
    public TraceIdController(SpanAccessor spanAccessor, RestTemplate restTemplate, 
      @Value("http://localhost:${local.server.port:${server.port:8080}}/other") String url) { 
     this.spanAccessor = spanAccessor; 
     this.restTemplate = restTemplate; 
     this.url = url; 
    } 

    @GetMapping(path = "/") 
    public String handlerOne() { 
     long traceId = spanAccessor.getCurrentSpan().getTraceId(); 
     log.info("loggin the real traceId => " + traceId); 
     String response = getRestTemplate().getForObject(getUrl(), String.class); 

     return "one" + response; 
    } 

    @GetMapping(path = "/other") 
    public String handlerOther() { 
     long traceId = spanAccessor.getCurrentSpan().getTraceId(); 
     log.info("loggin the real traceId => " + traceId); 
     return "other"; 
    } 
} 

@Getter 
@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 
@AutoConfigureMockMvc 
public class TraceIdAppTest { 

    @Autowired 
    private SpanAccessor spanAccessor; 

    @Autowired 
    private MockMvc mockMvc; 
    @Value("http://localhost:${local.server.port:${server.port:8080}}/other") 
    String url; 

    @Test 
    public void test() throws Exception { 
     mockMvc.perform(get("/")).andExpect(status().isOk()); 
     assertTrue("trace is wrong type", getSpanAccessor() instanceof DefaultTracer); 
    } 
} 

auf Test lief die ersten i seine feststellen, dass die Port url einen korrekten Wert auf dem Test nehmen, aber sein Wert Null auf dem Controller ist. Hardcoding der Port hat das Problem nicht behoben.

Antwort

1

Ich glaube nicht, dass es etwas mit Sleuth zu tun hat. Sie verwenden @SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT). Also wird der Port irgendwann auf den gebundenen Port gesetzt. Anfangs wird es gleich 0 sein, deshalb erhalten Sie den Port mit dem Wert 0, der in Ihren Controller injiziert wird. Sie können versuchen, den Port zu einem späteren Zeitpunkt über einen Setter zu injizieren (z. B. https://github.com/spring-cloud/spring-cloud-contract/blob/master/samples/standalone/pact/pact-http-client/src/test/java/com/example/loan/LoanApplicationServiceTests.java#L30-L36). In Ihrem Fall sollten Sie den Wert des Ports auflösen, sobald Sie die Anfrage gesendet haben oder wenn der Test zur Ausführung bereit ist.

+0

Vielen Dank für die schnelle Antwort, yeah, ich sah es, dass das Problem ist, dass der Controller vor dem Test initialisiert und natürlich vor dem Set te rigth port. Ich denke, dass die wahre Frage, warum? oder wie ändert man es? zu tun etwas wie Ihre Lösung oder diese @Before public void vorher() { ReflectionTestUtils.setField (Controller, "URL", URL); } oder sogar den Controller wie faul markieren, sollte es ein anderer Weg – nekperu15739

+0

Warum möchten Sie Ihren eigenen Port zu Ihrem eigenen Controller injizieren. Das macht keinen Sinn. Sie sollten dies in Ihren Tests langsam lösen. Alles andere ist nur ein Hack, um etwas Unpassendes zu tun. –