0

我有一個運行代碼,使用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中的端口需要在測試正確的值,但它的價值是在控制器上爲零。硬編碼的端口沒有解決問題。

回答

1

我不認爲它與Sleuth有什麼關係。您正在使用@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)。所以端口將被設置在某個點到達綁定端口。最初它將等於0,這就是爲什麼你的端口值等於0注入到你的控制器。你可以嘗試在稍後通過setter注入端口(像這樣的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

謝謝你的快速回答,是的,我看到問題是控制器在測試之前初始化,顯然在設置好端口之前。我認爲真正的問題是,爲什麼?或者如何改變它?不要做像你的解決方案或這一個@Before public void before(){ ReflectionTestUtils.setField(controller,「url」,url); }或甚至將控制器標記爲懶惰,它應該是另一種方式 – nekperu15739

+0

爲什麼要將自己的端口注入到自己的控制器中?這個不成立。你應該在測試中懶散地解決這個問題。其他任何事情都只是爲了做一些不正當的事情。 –