2017-02-16 10 views
2

У меня есть сервер 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-кода?

ответ

1

Я знаю, что это старый вопрос, и вы, вероятно, уже нашли другое решение для этого. Но я все равно отвечаю, что другие наткнулись на него, как я. У меня была аналогичная проблема, и я закончил использование @PostConstruct в своем тестовом классе для создания TestRestTemplate, настроенного по своему вкусу, вместо использования @TestConfiguration.

@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 
     } 
    } 
Смежные вопросы