2016-09-13 2 views
1

У меня есть простой интерфейс FeignClient, который я хотел бы выполнить «единичный»/интеграционный тест с поддельным HTTP-сервером, например WireMock. Идея состоит в том, чтобы протестировать сопоставление с ответом на выборку HTTP API, без настройки всего контекста Spring Boot/Cloud.Программно создайте экземпляр FeignClient для тестов

@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); 
} 

Есть ли способ программно создать экземпляр этого интерфейса, как источник хранилища данных через *RepositoryFactoryBean?

В исходном коде я вижу FeignClientFactoryBean, но он защищен пакетом, и в любом случае он полагается на объект для получения своих зависимостей.

ответ

0

Ну, вы может поддельные реальный клиент, используя остальные wiremock для целей тестирования, но это больше о содержащем функциональный тесте, что симулировать клиент работает сам себе. Это в основном не то, что вы действительно хотите проверить, потому что фактическая потребность в тестировании ваших компонентов с использованием вашего клиента ведет себя определенным образом.

Лучшая практика для меня заключается не в том, чтобы жить вживую с помощью фальшивого сервера, а издеваться над поведением клиентов с Mockito. Если вы используете Spring Загрузочный 1.4.0, вот путь:

Рассмотрим вас есть FooBarService, который внутренне использует ваш FooClient для peform некоторые FooBarService::someAction(String fooId), который выполняет определенную бизнес-логику, которая должна работать с обув с заданными ID

@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 
    } 
} 

на этом этапе вы должны сначала выяснить, что вы ожидаете клиент REST, чтобы ответить, когда просят «/ Foo/1/бар», создавая макет именно для этого случая и дать объект Bar вы ожидаете получить для этого API, и утверждаете, что ваше приложение находится в нужном состоянии.

+0

Благодарим вас за ответ, но это полная противоположность тому, что я искал, извините _ «unit test» _ вводит в заблуждение. Я знаю, что могу издеваться над компонентами в рамках единичного теста с использованием контекста Spring, я хочу, чтобы программная реализация «FeignClient» была реализована программно _without_, чтобы настроить контекст Spring. Я хочу проверить, соответствуют ли относительные пути моего клиента, и работает ли JSON-сопоставление - точно так же, как тест интеграции persistence с HSQLDB. Чем больше я смотрю на исходный код, тем больше я думаю, что это невозможно без контекста Spring Boot/Cloud. –

+0

Это действительно невозможно, так как сам @FeignClient - это весенняя аннотация. Когда вы заглянете в источник пружины, вы увидите, что контекст принимает внутреннюю декларацию и настройку feign вручную. Вы можете сделать это самостоятельно и протестировать против поддельного HTTP-сервера, но это будет очень много работы. –

+0

Возможно с репозиториями JPA или Cassandra, которые также являются аннотированными интерфейсами. Разница заключается в том, что классы FactoryBean Spring Data являются общедоступными и полностью отделены от контекста Spring. Вероятно, они не потрудились сделать это с помощью «FeignClient», потому что базовый Feign уже является автономным проектом. –