如何配置Spring TestRestTemplate

时间:2017-02-16 11:21:48

标签: java spring rest spring-data-rest

我有一个REST(spring-hateoas)服务器,我想用JUnit测试进行测试。因此,我使用的是自动注入的TestRestTemplate

但是,我现在如何为此预先配置的TestRestTemplate添加更多配置?我需要配置rootURI并添加拦截器。

这是我的JUnit测试课程:

@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.但在该静态类中,我无法访问localServerPortbasePath

  @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考虑all_different/1?是不是完全预配置的想法,这个包装类的整个用例?

doc sais

  

如果您使用的是@SpringBootTest注释,那么TestRestTemplate就是   自动可用,可以@Autowired到您测试。如果你   需要自定义(例如添加其他消息   转换器)使用RestTemplateBuilder @Bean。

在完整的Java代码示例中,它看起来如何?

3 个答案:

答案 0 :(得分:11)

我知道这是一个老问题,你现在可能已经找到了另一个解决方案。但是,无论如何,我还是会像其他人那样磕磕绊绊地回答。我有一个类似的问题,最后在我的测试类中使用@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
        }
    }

答案 1 :(得分:0)

为了配置您的TestRestTemplate,官方documentation建议您使用TestRestTemplate,如下面的示例所示(例如,添加基本身份验证):

public class YourEndpointClassTest {
    private static final Logger logger = LoggerFactory.getLogger(YourEndpointClassTest.class);  

    private static final String BASE_URL = "/your/base/url";

    @TestConfiguration
    static class TestRestTemplateAuthenticationConfiguration {

        @Value("${spring.security.user.name}")
        private String userName;

        @Value("${spring.security.user.password}")
        private String password;

        @Bean
        public RestTemplateBuilder restTemplateBuilder() {
            return new RestTemplateBuilder().basicAuthentication(userName, password);
        }
    }


    @Autowired
    private TestRestTemplate restTemplate;

//here add your tests...

答案 2 :(得分:0)

我遇到一种情况,当我需要使用TestRestTemplate访问我们测试环境中远程服务器上的REST端点时。因此,该测试并未启动Spring Boot应用程序,而只是连接到远程端点并从那里使用了REST服务。测试的配置更加简单,执行速度也更快,因为它没有建立复杂的Spring(Boot)上下文。这是我的配置的一部分:

@RunWith(SpringRunner.class)
public class RemoteRestTestAbstract {

protected TestRestTemplate restTemplate;
private static RestTemplateBuilder restTemplateBuilder;


@BeforeClass
public static void setUpClass() {
    restTemplateBuilder = new RestTemplateBuilder()
        .rootUri("http://my-remote-test-server.my-domain.com:8080/");
}

@Before
public void init() {
    restTemplate = new TestRestTemplate(restTemplateBuilder);
    login();
}

//...

}