简体   繁体   English

使用@RestClientTest对rest客户端进行Spring启动测试

[英]Spring boot testing of a rest client using @RestClientTest

I am using spring boot 1.5.8 and want to test my client: 我正在使用spring boot 1.5.8并想测试我的客户端:

@Component
public class RestClientBean implements RestClient {
  private Map<String, RestTemplate> restTemplates = new HashMap<>();

  @Autowired
  public RestClientBean(RestTemplateBuilder builder, SomeConfig conf) {
    restTemplates.put("first", builder.rootUri("first").build();
    restTemplates.put("second", builder.rootUri("second").build();
  }
}

with the following test: 通过以下测试:

@RunWith(SpringRunner.class)
@RestClientTest(RestClient.class)
public class RestClientTest {
  @Autowired
  private RestClient client;

  @Autowired
  private MockRestServiceServer server;

  @TestConfiguration
  static class SomeConfigFooBarBuzz {
    @Bean
    public SomeConfig provideConfig() {
        return new SomeConfig(); // btw. not sure why this works, 
                                 // but this is the only way 
                                 // I got rid of the "unable to load 
                                 // SomeConfig auto-wire" or something like this :)
                                 // Anyway not my main issue
                                 // EDIT: just realized that the whole 
                                 // @TestConfiguration part can be avoided by
                                 // adding SomeConfig.class to the classes in the
                                 // @RestClientTest annotation
    }
  }

  @Before
  public void setUp() throws Exception {
    server.expect(requestTo("/somePath")) // here an exception is thrown
                                          // (main issue)
          .andRespond(withSuccess("<valid json>", MediaType.APPLICATION_JSON));
  }
}

The exception is very clear: 例外很清楚:

java.lang.IllegalStateException: Unable to use auto-configured 
MockRestServiceServer since MockServerRestTemplateCustomizer has been bound to 
more than one RestTemplate

But is it somehow possible to get this tested or is it not allowed to instantiate two different rest templates in one client class? 但是,它是否可能以某种方式进行测试,或者不允许在一个客户端类中实例化两个不同的休息模板? I have just the need to use the first rest template in some cases and the second one in some others. 我只需要在某些情况下使用第一个休息模板,在其他情况下使用第二个模板。

After some days of investigation and communication with spring folks via GitHub I found a solution for me and not receiving an answer here means my solution might be valuable for someone: 经过几天的调查并通过GitHub与春天的人们沟通后,我找到了一个解决方案,但我没有收到答案,这意味着我的解决方案可能对某些人有价值:

@RunWith(SpringRunner.class)
@RestClientTest(RestClient.class)
public class RestClientTest {
  @Autowired
  private RestClient client;

  private MockRestServiceServer firstServer;
  private MockRestServiceServer secondServer;
  private static MockServerRestTemplateCustomizer customizer; 

  @TestConfiguration
  static class RestTemplateBuilderProvider {
    @Bean
    public RestTemplateBuilder provideBuilder() {
      customizer = new MockServerRestTemplateCustomizer();
      return new RestTemplateBuilder(customizer);
    }
  }

  @Before
  public void setUp() {
    Map<RestTemplate, MockRestServiceServer> servers = customizer.getServers();
    // iterate and assign the mock servers according to your own strategy logic
  }

  @Test
  public void someTest() {
    firstServer.expect(requestTo("/somePath"))
               .andRespond(withSuccess("some json body"), 
                           MediaType.APPLICATION_JSON));

    // call client

    // verify response
  }

Basically specify a number of mock servers same as the number of rest templates you use in your client code, then specify a test configuration providing a rest builder with a customizer, so that your client code's rest templates will be built via this customized builder. 基本上指定一些模拟服务器与您在客户端代码中使用的其余模板的数量相同,然后指定一个测试配置,提供具有自定义程序的休息构建器,以便通过此自定义构建器构建客户端代码的其余模板。 Then use the customizer to get the mock servers bounded to the created rest templates and define expectations on them as you want. 然后使用自定义程序将模拟服务器绑定到创建的其余模板,并根据需要定义对它们的期望。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM