0

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); 
    } 
} 

에서 호출 문제를 서로 하나의 컨트롤러가 있습니다. 포트를 하드 코드하여 문제를 해결하지 못했습니다.

답변

1

나는 그것이 Sleuth와는 아무 관계가 없다고 생각합니다. @SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT)를 사용하고 있습니다. 따라서 포트는 바운드 포트로 설정됩니다. 처음에는 0과 같아 지므로 컨트롤러에 0을 입력 한 포트를 가져옵니다. 나중에 setter를 통해 포트를 주입 할 수 있습니다 (sth : 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). 요청을 보내거나 테스트가 실행 준비가되면 포트 값을 확인해야합니다.

+0

빠른 답변을 주셔서 감사합니다. 예, 컨트롤러가 테스트 전에 초기화된다는 것과 분명히 세트 테 강도 포트 이전에 문제가 있다는 것을 알았습니다. 나는 진짜 질문이 왜 그런 것이라고 생각 하는가? 또는 그것을 어떻게 바꾸는가? 당신의 해결책이나 이것과 같은 일을하지 않는 것. @ 전에 @ public void before() { ReflectionTestUtils.setField (controller, "url", url); } 또는 게으른 컨트롤러 표시를하면 다른 방법이됩니다. – nekperu15739

+0

왜 자신의 컨트롤러에 자신의 포트를 삽입하려고합니까? 그것은 말도 안돼. 테스트에서 느리게 해결해야합니다. 다른 것은 부적절한 일을하기위한 해킹 일뿐입니다. –