Ich habe einen REST-Server (Spring-hateoas), den ich mit einem JUnit-Test testen möchte. Daher verwende ich eine Autoinjektion TestRestTemplate
.So konfigurieren Sie Spring TestRestTemplate
Aber wie füge ich jetzt zu dieser vorkonfigurierten TestRestTemplate noch weitere Konfigurationen hinzu? Ich muss die rootURI konfigurieren und Interzeptoren hinzufügen.
Thisi s meine JUnit-Testklasse:
@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. Aber innerhalb dieser statische Klasse kann ich auf nicht localServerPort
oder 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);
}
}
Meine wichtigste Frage: Warum TestRestTemplate
nehmen nicht spring.data.rest.base-path
von application.properties
in erster Linie Rechnung? Ist nicht die Idee, komplett vorkonfiguriert zu sein, der ganze Anwendungsfall dieser Wrapper-Klasse?
Der Doc sais
Wenn Sie die @SpringBootTest Anmerkung verwenden, ist ein TestRestTemplate automatisch zur Verfügung und können in Ihnen Test @Autowired werden. Wenn Sie Anpassungen benötigen (z. B. zum Hinzufügen zusätzlicher Nachrichten Konverter), verwenden Sie einen RestTemplateBuilder @Bean.
Wie sieht das in einem vollständigen Java-Codebeispiel aus?