TraceId 로그에 sleuth를 사용하여 봄 부팅 및 봄 구름이있는 실행 코드가 있습니다. 그러나 나는 그러나 그 값이 컨트롤러 제로 첫 번째 난, 해당 URL의 포트 테스트에 올바른 값을 가지고 있음을 알 테스트에서 실행되는 integrationTestrestTemplate이 포함 된 통합 테스트 sleuth
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);
}
}
에서 호출 문제를 서로 하나의 컨트롤러가 있습니다. 포트를 하드 코드하여 문제를 해결하지 못했습니다.
빠른 답변을 주셔서 감사합니다. 예, 컨트롤러가 테스트 전에 초기화된다는 것과 분명히 세트 테 강도 포트 이전에 문제가 있다는 것을 알았습니다. 나는 진짜 질문이 왜 그런 것이라고 생각 하는가? 또는 그것을 어떻게 바꾸는가? 당신의 해결책이나 이것과 같은 일을하지 않는 것. @ 전에 @ public void before() { ReflectionTestUtils.setField (controller, "url", url); } 또는 게으른 컨트롤러 표시를하면 다른 방법이됩니다. – nekperu15739
왜 자신의 컨트롤러에 자신의 포트를 삽입하려고합니까? 그것은 말도 안돼. 테스트에서 느리게 해결해야합니다. 다른 것은 부적절한 일을하기위한 해킹 일뿐입니다. –