Как правильно эмулировать ответы FeignClient в тестах JUnit

Я использую FeignClient для связи между микросервисами. Я хочу протестировать один микросервис без запуска другого, поэтому мне нужно как-то эмулировать его ответы. В это время я издеваюсь над feignClient. Однако правильно ли это для имитации ответов FeignClient в этой ситуации?

Мой фиктивный клиент:

@FeignClient(name="shortestPath", url="http://localhost:5000")
public interface GraphFeignClient {

    @PostMapping(path="/short")
    public List<Integer> getShortestPath(@RequestParam("source") int source,
                                         @RequestParam("target") int target,
                                         @RequestBody Graph graph);

}

Мой тест:

@SpringBootTest
public class GraphJsonApplicationTests {

    @Mock
    GraphFeignClient graphFeignClient;

    @Autowired
    @InjectMocks
    private GraphServiceClient graphServiceClient;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testSavingShortestPath() throws Exception {

        given(graphFeignClient.getShortestPath(anyInt(),anyInt(),any()))
                .willReturn(Arrays.asList(1,2,3,4,5)); 

        //...

    }
}

person Kirill Ch    schedule 02.08.2019    source источник


Ответы (1)


Писать модульные тесты для фиктивных клиентов не имеет особого смысла, поэтому единственный способ тестирования — это написание интеграционных тестов. Для интеграционного тестирования http-клиентов вы можете использовать один из двух подходов:

1) Если у вас нет контроля над службой, которую вы вызываете, вы можете использовать wiremock, чтобы имитировать ответы от сервис. В этом случае вы создадите настоящий bean-компонент и действительно перейдете через HTTP к фиктивному серверу. Он поддерживает различные типы заглушек.

2) Если у вас есть контроль над службой, которую вы вызываете, вы можете применить подход, ориентированный на потребителя, и использовать Облачный контракт Spring

person Ivan Lymar    schedule 02.08.2019
comment
Я использую JUnit НЕ для тестирования FeignClient, а для тестирования компонентов моего микросервиса на наличие различных ответов от другого микросервиса. - person Kirill Ch; 02.08.2019
comment
Если вы пишете модульные тесты для других компонентов, которые вызывают фиктивные клиенты, то ваш подход отлично работает. Однако я бы не стал привлекать бины Spring к тестированию, вы можете просто использовать аннотации @Mock и @InjectMocks. Поскольку, если вы тестируете контекст весны, это не модульные тесты, а интеграционные тесты. - person Ivan Lymar; 02.08.2019
comment
Спасибо. Ваш ответ ценен. - person Kirill Ch; 02.08.2019