Как выполнить юнит-тест кэшируемого метода - PullRequest
0 голосов
/ 04 июля 2019

Я использую 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 {
 /.../
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...