简体   繁体   中英

Integration test sleuth with restTemplate

I have a running code with spring boot and spring cloud using sleuth to log the TraceId. However i have problems in call one controller from other in the integrationTest

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

running on test the first i notice its that the port on url take a correct value on the test, however its value is zero on the controller. hardcoding the port didnt fix the problem.

I don't think it has anything to do with Sleuth. You're using @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) . So the port will be set at some point to the bound port. Initially it will be equal to 0, that's why you get the port with value equal to 0 injected to your controller. You can try to inject the port via a setter at a later time (sth like this 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 ). In your case you should resolve the value of the port once you're sending the request or when the test is ready to run.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM