Я использую Spring Cache.
У меня есть контроллер Spring, и как часть метода, отвечающего за этот запрос GET
, я пометил его @Cacheable(value = "customer", key = "#accountId")
. В этом методе он вызывает API и выполняет некоторую бизнес-логику, а затем возвращает DTO. С аннотацией кеша я ожидаю, что при первом выполнении этот код будет работать нормально, но при любых последующих вызовах он получит результат из кеша ... это верно, верно?
Я пишу модульный тест, чтобы убедиться, что API был вызван один раз, несмотря на то, что на этот контроллер было отправлено несколько запросов. Но проблема в том, что он продолжает вызывать API несколько раз, а не вызывать кеш.
Юнит тест:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebMvcTest(controllers = CustomerController.class, secure = false)
public class CustomerControllerTest {
private static final String ACCOUNT_ID = "1111";
@MockBean
private CustomerService customerService;
@MockBean
private CustomerPortAPI customerPortAPI;
@Autowired
MockMvc mockMvc;
@Before
public void setUp(){
when(customerService.getStatus(any())).thenReturn("test");
when(customerPortAPI.getAccount(any())).thenReturn(Account.builder().build());
}
@Test
public void shouldReturnCustomerDTOt() throws Exception {
when(customerService.Status(any())).thenReturn("test");
when(customerPortAPI.getAccount(ACCOUNT_ID)).thenReturn(Account.builder().accountId(ACCOUNT_ID).build());
mockMvc.perform(get("/customer/{accountId}/status", ACCOUNT_ID)
.accept(APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("status").value(customer.NOT_REQUIRED.name()));
mockMvc.perform(get("/customer/{accountId}/status", ACCOUNT_ID)
.accept(APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("status").value(customer.NOT_REQUIRED.name()));
verify(customerPorAPI, times(1)).getAccount(ACCOUNT_ID);
}}
Метод контроллера:
@Cacheable(value = "statusEligibility", key = "#customerId")
@GetMapping
public CustomerStatusDTO getCustomerStatus(@PathVariable String customerId) {
Customer customer = cusomterPort.getAccount(customerId);
Status status = service.getStatus(customer);
if (status.equals(Cons.REQUIRED)) {
/.../
} else {
/.../
}