我有一個運行代碼,使用spring啓動和spring cloud使用sleuth來記錄TraceId。不過我有呼叫的問題從另一個控制器在integrationTest集成測試slert與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);
}
}
上試運行第一我注意到它是在URL中的端口需要在測試正確的值,但它的價值是在控制器上爲零。硬編碼的端口沒有解決問題。
謝謝你的快速回答,是的,我看到問題是控制器在測試之前初始化,顯然在設置好端口之前。我認爲真正的問題是,爲什麼?或者如何改變它?不要做像你的解決方案或這一個@Before public void before(){ ReflectionTestUtils.setField(controller,「url」,url); }或甚至將控制器標記爲懶惰,它應該是另一種方式 – nekperu15739
爲什麼要將自己的端口注入到自己的控制器中?這個不成立。你應該在測試中懶散地解決這個問題。其他任何事情都只是爲了做一些不正當的事情。 –