以编程方式实例化FeignClient以进行测试

时间:2016-09-13 10:06:27

标签: spring-cloud-netflix

我有一个简单的FeignClient接口,我想用假的HTTP服务器“单元”/集成测试,例如WireMock。我们的想法是使用抽样的HTTP API响应测试映射,而不配置整个Spring Boot / Cloud Context

strcmp

有没有办法以编程方式实例化此接口,例如通过@FeignClient(name = "foo", url = "${foo.url}") public interface FooClient { @RequestMapping(value = "/foo/{foo-id}/bar", method = RequestMethod.GET) public Bar getBar(@PathVariable("foo-id") String fooId); } 的Spring Data Repository?

我在源代码中看到*RepositoryFactoryBean,但它受包保护,并且依赖于FeignClientFactoryBean对象来检索其依赖项。

1 个答案:

答案 0 :(得分:0)

嗯,你 可以 伪造一个真正的休息客户端使用wiremock进行测试,但这更多的是包含功能测试,假装客户自己工作。这通常不是您真正想要测试的,因为实际需要是使用您的客户端以指定的方式测试您的组件。

对我而言,最好的做法是不要在维护虚假服务器时努力工作,而是用Mockito嘲笑客户行为。如果您使用Spring Boot 1.4.0,可以采用以下方法:

考虑您有一些FooBarService,它在内部使用您的FooClient来执行某些FooBarService::someAction(String fooId),这会执行一些业务逻辑,需要使用给定ID的foo

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
class FooUnitTest {

   @Autowired;
   private FooBarService fooBarService;

   @MockBean;
   private FooClient fooClient;

   @Test
   public void testService() {
      given(fooClient.getBar("1")).willReturn(new Bar(...));

      fooBarService.someAction("1");

      //assert here, that someAction did what it supposed to do for that bar
   }
}

此时,您首先应该澄清一下,当您要求“/ foo / 1 / bar”时,您希望REST客户端做出什么响应,通过为该情况创建一个模拟并给出您希望收到的Bar对象该API,并声明您的应用程序处于所需状态。