2017-02-16 3 views
2

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?

Antwort

1

Ich weiß, das ist eine alte Frage, und Sie haben wahrscheinlich eine andere Lösung dafür gefunden. Aber ich antworte trotzdem, dass andere darüber stolpern wie ich. Ich hatte ein ähnliches Problem und verwendete @PostConstruct in meiner Testklasse, um ein TestRestTemplate zu erstellen, das nach meinem Geschmack konfiguriert wurde, anstatt @TestConfiguration zu verwenden.

@RunWith(SpringJUnit4ClassRunner.class) 
    @EnableAutoConfiguration 
    @SpringBootTest(classes = {BackendApplication.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
    public class MyCookieClientTest { 
     @LocalServerPort 
     int localPort; 

     @Autowired 
     RestTemplateBuilder restTemplateBuilder; 

     private TestRestTemplate template; 

     @PostConstruct 
     public void initialize() { 
      RestTemplate customTemplate = restTemplateBuilder 
       .rootUri("http://localhost:"+localPort) 
       .... 
       .build(); 
      this.template = new TestRestTemplate(customTemplate, 
       null, null, //I don't use basic auth, if you do you can set user, pass here 
       HttpClientOption.ENABLE_COOKIES); // I needed cookie support in this particular test, you may not have this need 
     } 
    } 
Verwandte Themen