私は、SpringブートとSpring Cloudを使用して実行コードを取得しており、トレースIDを記録するためにsleuthを使用しています。しかし、私はintegrationTestrestTemplateを使用した統合テストsleuth
私はそのURLにポートがテストに正しい値をとることに気づく最初は、しかし、その値は、コントローラ上ゼロであるテストで実行されている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);
}
}
内の他からの電話1のコントローラに問題があります。ポートをハードコーディングしても問題は解決しませんでした。
すぐに回答ありがとう、ええ、私はそれがコントローラがテストの前に初期化していることが明らかです。私は本当の疑問は、それはなぜだと思いますか?どのように変更するか?あなたのソリューションやこのようなことをしないようにする@前に public void before(){ ReflectionTestUtils.setField(controller、 "url"、url); }またはコントローラにlazyのようなマークを付けても、それは別の方法でなければなりません – nekperu15739
自分のコントローラに自分のポートを注入したいのはなぜですか?意味がない。テストでこの問題を解決する必要があります。それ以外のものは何か不適切なことをするためのちょうどハックです。 –