У меня есть контроллер шлюза, который использует внутренние службы.Я пытаюсь написать интеграционный тест, который симулирует клиент 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 ?Буду признателен за любой совет