0

私は、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のコントローラに問題があります。ポートをハードコーディングしても問題は解決しませんでした。

答えて

1

私はそれがスルーとは関係ないと思う。 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)を使用しています。そのため、ポートはあるポイントでバインドされたポートに設定されます。最初は0に等しいので、0に等しい値のポートをコントローラに注入するのはこのためです。あなたは後でセッターを介してポートを注入しようとすることができます(このような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); }またはコントローラにlazyのようなマークを付けても、それは別の方法でなければなりません – nekperu15739

+0

自分のコントローラに自分のポートを注入したいのはなぜですか?意味がない。テストでこの問題を解決する必要があります。それ以外のものは何か不適切なことをするためのちょうどハックです。 –

関連する問題