Тест случайного порта 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
— случайный порт работающего веб-контейнера.