Тест случайного порта Spring Boot OpenFeign

У меня есть клиент OpenFeign, настроенный следующим образом:

@FeignClient(name = "myService", qualifier = "myServiceClient", url = "${myservice.url}")
public interface MyServiceClient {
...
}

и тест Spring Boot настроен следующим образом:

@SpringBootTest(webEnvironment = RANDOM_PORT, classes = MyApplication.class)
@RunWith(SpringRunner.class)
@EnableFeignClients(clients = MyServiceClient .class)
public class ReservationSteps {
...
}

Предполагается, что тест запускает приложение и отправляет ему запрос с помощью клиента Feign.

Проблема в значении RANDOM_PORT.

Как объявить свойство myservice.url в файле свойств, чтобы оно включало правильный порт?

Я пробовал это:

myservice.url=localhost:${local.server.port}

но это приводит к "localhost:0".

Я не хочу использовать постоянное значение для порта.

Пожалуйста помоги. Спасибо!

2 ответа

Я знаю, что это старый вопрос, но, возможно, этот ответ будет кому-то полезен


В качестве обходного пути мы можем разрешить хосту разрешаться до Spring Ribbon. Затем вы должны динамически настроить хост прямо перед запуском теста.

Сначала добавьте зависимость maven, если у вас ее еще нет

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
   <scope>test</scope>
</dependency>

Затем настройте свой тест на запуск с "пустым" URL-адресом конфигурации для хоста, который является myservice.url недвижимость здесь

@SpringBootTest(webEnvironment = RANDOM_PORT, classes = MyApplication.class)
@RunWith(SpringRunner.class)
@EnableFeignClients(clients = MyServiceClient.class)
@TestPropertySource(properties = "myservice.url=") // this makes sure we do the server lookup with ribbon
public class MyTest {
   ...
}

Затем в @Beofre, все, что нам нужно сделать, это указать URL-адрес службы для ленты, мы можем сделать это с помощью простого System.setProperty()

public class MyTest {

    @LocalServerPort
    private int port;

    @Before
    public void setup() {
        System.setProperty("MyServiceClient.ribbon.listOfServers", "http://localhost:" + port);
        ...
    }

Другой более простой способ — отследить метод, используемый для определения IP-адреса службы. По умолчанию он вызываетCompositeDiscoveryClient#getInstances()сделать это. Вместе с@LocalServerPortчтобы получить доступ к порту веб-контейнера, вы можете сделать что-то вроде:

      @SpringBootTest(webEnvironment = RANDOM_PORT)
public class FooTest {


    @SpyBean
    private CompositeDiscoveryClient compositeDiscoveryClient;

    @LocalServerPort
    private int serverPort;


    @Test
    void test(){
        //call stubResolveMyService() before you invoke any FeignClient 's method
    }


    private void stubResolveMyService(){
        DefaultServiceInstance instance = new DefaultServiceInstance("some-instance" , "myService", "127.0.0.1",serverPort,false);
        when(compositeDiscoveryClient.getInstances("myService")).thenReturn(List.of(instance));
    }

}

Он разрешает IP-адрес службы, идентификатор которойmyServiceк127.0.0.1:XXXXXгдеXXXXX— случайный порт работающего веб-контейнера.

Другие вопросы по тегам