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.
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
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. –