2017-09-04 42 views
3

为使用RestTemplate(和引擎盖下的功能区)和Eureka解决服务B的Spring Boot应用程序(服务A)编写集成测试依赖关系,当调用服务A时,我得到“无实例可用”异常。使用WireMock和Eureka进行Spring Boot集成测试失败,出现“没有可用实例”

我尝试通过WireMock模拟服务B,但我甚至都没有使用WireMock服务器。似乎RestTemplate试图从Eureka中获取服务实例,该实例在我的测试中没有运行。它通过属性被禁用。

服务A呼叫服务B. 通过RestTemplate,Ribbon和Eureka完成服务发现。

有没有人有一个包含Spring,Eureka和WireMock的工作示例?

+0

如果你都还好用嘲讽的服务B,您可以用'MockRestServiceServer'。我可以分享一个例子。 – barbakini

+0

这可能是一个选项,但我想包括实际的服务电话,即使响应是罐装的。 – derSteve

+0

当使用'MockRestServiceServer'时,spring启动实际上是一个调用。但只有它被'MockRestServiceServer'所捕获,并且它返回你确定的响应。对于尤里卡部分。它已经是一个熟练的框架工作,你不需要测试它(对于色带或负载平衡问题等) – barbakini

回答

0

这是我在我的项目完成:

某处在您的项目配置:

@LoadBalanced 
@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) { 
    RestTemplate restTemplate = builder.build(); 
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 
    return restTemplate; 
} 

@Bean 
public SomeRestClass someRestClass() { 
    SomeRestClass someRestClass = new SomeRestClass (environment.getProperty("someservice.uri"), restTemplate(new RestTemplateBuilder())); 
    return parameterRest; 
} 

而且SomeRestClass:

public class SomeRestClass { 

    private final RestTemplate restTemplate; 

    private final String someServiceUri; 

    public LocationRest(String someServiceUri, RestTemplate restTemplate) { 
     this.someServiceUri= someServiceUri; 
     this.restTemplate = restTemplate; 
    } 

    public String getSomeServiceUri() { 
     return locationUri; 
    } 

    public SomeObject getSomeObjectViaRest() { 
     //making rest service call 
    } 
} 

与测试类SomeRestClass

@RunWith(SpringRunner.class) 
@RestClientTest(SomeRestClass.class) 
public class SomeRestClassTest { 
    @Autowired 
    private SomeRestClass someRestClass; 

    @Autowired 
    private MockRestServiceServer server; 

    @Test 
    public void getSomeObjectViaRestTest() throws JsonProcessingException { 
     SomeResponseObject resObject = new SomeResponseObject(); 
     ObjectMapper objectMapper = new ObjectMapper(); 
     String responseString = objectMapper.writeValueAsString(resObject); 

     server.expect(requestTo(locationRest.getSomeServiceUri() + "/some-end-point?someParam=someParam")).andExpect(method(HttpMethod.POST)) 
      .andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON_UTF8).body(responseString)); 
     someRestClass.getSomeObjectViaRest(); 

    } 
} 

注意:我为eureka客户端进行了diasble,因为否则您必须嘲笑一个尤里卡服务器。所以我加了测试eureka.client.enabled =假 application.properties中

+0

在这种情况下,RestTemplate是否意识到没有ServiceRegistry/Eureka请求特定的服务端点?在我的测试中,它没有意识到这一点,并试图解决来自尤里卡的服务。这就是我得到例外的原因。我的设置eureka.client.enabled = false设置在我的配置中 - >这意味着它不会将自己注册为eureka作为服务本身。 – derSteve

+0

@derSteve是的,RestTemplate只是尝试点击地址,MockRestServiceServer捕获该请求。已发布的示例已完成,我将其从我的项目中剪切掉,然后使用eureka和RestTemplate。这个测试可以给你你想要的。离这个测试更远的一步是通过ruby-cucumber或任何其他QA相关技术编写** real **集成测试,并在测试环境中运行这些测试,并实际运行服务A,服务B和eureka服务 – barbakini

0

我昨天遇到同样的问题,为了完整起见,这里是我的解决方案:

这是我的“活”的配置下src/main/java/.../config

//the regular configuration not active with test profile 
@Configuration 
@Profile("!test") 
public class WebConfig { 
    @LoadBalanced 
    @Bean 
    RestTemplate restTemplate() { 
     //you can use your regular rest template here. 
     //This one adds a X-TRACE-ID header from the MDC to the call. 
     return TraceableRestTemplate.create(); 
    } 
} 

我加入此配置以测试夹src/main/test/java/.../config

//the test configuration 
@Configuration 
@Profile("test") 
public class WebConfig { 
    @Bean 
    RestTemplate restTemplate() { 
     return TraceableRestTemplate.create(); 
    } 
} 

在测试情况下,我启用配置文件test

//... 
@ActiveProfiles("test") 
@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
public class ServerCallTest { 
    @Autowired 
    private IBusiness biz; 

    @Autowired 
    private RestTemplate restTemplate; 

    private ClientHttpRequestFactory originalClientHttpRequestFactory; 

    @Before 
    public void setUp() { 
     originalClientHttpRequestFactory = restTemplate.getRequestFactory(); 
    } 

    @After 
    public void tearDown() { 
     restTemplate.setRequestFactory(originalClientHttpRequestFactory); 
    } 

    @Test 
    public void fetchAllEntries() throws BookListException { 
     MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); 

     mockServer     
      .andExpect(method(HttpMethod.GET)) 
      .andExpect(header("Accept", "application/json")) 
      .andExpect(requestTo(endsWith("/list/entries/"))) 
      .andRespond(withSuccess("your-payload-here", MediaType.APPLICATION_JSON)); 

     MyData data = biz.getData(); 

     //do your asserts 
    } 
} 
相关问题