Клиент Mock Feign в Spring-контроллере в интеграционном тесте - PullRequest
0 голосов
/ 29 мая 2019

У меня есть контроллер шлюза, который использует внутренние службы.Я пытаюсь написать интеграционный тест, который симулирует клиент Feign для контроллера, но он не работает, как я ожидал.

У меня есть следующий клиент Feign:

public interface StoreManagementClient {
    @RequestLine("GET /v1/stores/{storeId}")
    @Headers({"Accept: application/json", "Content-Type: application/json;charset=UTF-8"})
    StoreDetails getStoreDetails(@Param("storeId") String storeId);
}

Контроллер магазина:

@Validated
@Controller
@RequestMapping("${gateway.path}")
public class StoreController {

    @Autowired
    private StoreManagementClient storeManagementClient;

    @GetMapping(value = "/stores/{storeId}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<StoreDetails> getStoreDetails(
            @PathVariable("storeId") String storeId) {
        StoreDetails details = storeManagementClient.getStoreDetails(storeId);
        return ResponseEntity.ok(details);
    }
}

И интеграционный тест:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {GatewayServiceApplication.class},
        webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class ClientIntegrationTest {
    @Autowired
    private StoreController storeController;

    @MockBean
    private StoreManagementClient storeManagementClient;

    private MockClient mockClient;

    @Before
    public void setUp() throws Exception {
        mockClient = new MockClient();
    }

    @Test
    public void testCorrectGetStoreDetailsRequest() throws JsonProcessingException {

        String storeId = "store-1";

        StoreDetails storeDetails = new StoreDetails();
        storeDetails.setId(storeId);
        storeDetails.setType("grocery");

        String response = new ObjectMapper().writeValueAsString(storeDetails);

        storeManagementClient = Feign.builder()
                .encoder(new JacksonEncoder())
                .decoder(new JacksonDecoder())
                .client(mockClient
                        .ok(RequestKey.builder(feign.mock.HttpMethod.GET, "/v1/stores/" + sroreId)
                                .headers(ImmutableMap.of(
                                        ACCEPT, newArrayList("application/json"),
                                        CONTENT_TYPE, newArrayList("application/json;charset=UTF-8"))).build(),
                                response
                        ))
                .target(new MockTarget<>(StoreManagementClient.class));

        // when
        ResponseEntity<StoreDetails> result = storeController.getStoreDetails(storeId);

        // then
        StoreDetails resultBody = result.getBody();

        assertThat(result.getStatusCode()).isEqualTo(HttpStatus.OK);
        assertThat(resultBody.getId()).isEqualTo(storeId);
        assertThat(resultBody.getType()).isEqualTo("grocery");
}

Я полагаю, что тест должен имитировать ответ в соответствии с описанным Feign Client.Но на самом деле это возвращает null.

Должен ли я сделать что-то не так с насмешливым клиентом Feign?Возможно, я смешал в одном тестовом тестировании клиент Feign и мой собственный контроллер, и мне нужно разделить его и написать модульный тест для клиента Feign, например Пример Mock Feign Client ?Буду признателен за любой совет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...