У меня есть сервер REST (spring-hateoas), который я бы хотел протестировать с помощью теста JUnit. Поэтому я использую autoinjected TestRestTemplate
.Как настроить Spring TestRestTemplate
Но как мне добавить дополнительную конфигурацию для этой предварительно настроенной тестовой таблицы TestRestTemplate? Мне нужно настроить rootURI и добавить перехватчики.
Thisi моя JUnit Test Класс:
@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RestEndpointTests {
private Logger log = LoggerFactory.getLogger(this.getClass());
@LocalServerPort
int localServerPort;
@Value(value = "${spring.data.rest.base-path}") // nice trick to get basePath from application.properties
String basePath;
@Autowired
TestRestTemplate client; // how to configure client?
[... here are my @Test methods that use client ...]
}
The documentation sais that a static @TestConfiguration
class can be used. Но внутри этого статического класса я не могу получить доступ к localServerPort
или basePath
:
@TestConfiguration
static class Config {
@Bean
public RestTemplateBuilder restTemplateBuilder() {
String rootUri = "http://localhost:"+localServerPort+basePath; // <=== DOES NOT WORK
log.trace("Creating and configuring RestTemplate for "+rootUri);
return new RestTemplateBuilder()
.basicAuthorization(TestFixtures.USER1_EMAIL, TestFixtures.USER1_PWD)
.errorHandler(new LiquidoTestErrorHandler())
.requestFactory(new HttpComponentsClientHttpRequestFactory())
.additionalInterceptors(new LogRequestInterceptor())
.rootUri(rootUri);
}
}
Мой самый важный вопрос: Почему не TestRestTemplate
принимать spring.data.rest.base-path
от application.properties
во внимание в первую очередь? Разве не идея полной предварительной настройки, весь прецедент этого класса-оболочки?
Док саис
Если вы используете @SpringBootTest аннотацию, TestRestTemplate является автоматически доступны и могут быть @Autowired в вас тест. Если вам нужны настройки (например, для добавления дополнительного сообщения преобразователей), используйте RestTemplateBuilder @Bean.
Как это выглядит в полном примере Java-кода?