JPARepository: ничего не происходит при deleteAll ();deleteAllInBatch () работает - PullRequest
0 голосов
/ 10 октября 2019

В моих интеграционных тестах Spring (с использованием JUnit 5. Мой тестовый класс аннотирован @SpringBootTest(classes = {SecurityBeanOverrideConfiguration.class, XXXApp.class}), я пытаюсь вызвать repository.deleteAll() в моем методе @AfterEach.

Глядя на SQL вВ журналах кажется, что ничего не выполняется, и, действительно, в следующих тестах сущность с таким же идентификатором не может быть создана, потому что она уже существует, то есть что-то помешало базе данных. Я играл с разными типами транзакций (распространение, изоляция .. .), как упоминают другие вопросы, но безрезультатно.

Интересно, что вызов repository.deleteAllInBatch() вместо deleteAll() работает : все тесты пройдены.

Что происходит?

РЕДАКТИРОВАТЬ: Добавление кода.

@Transactional
@SpringBootTest(classes = {SecurityBeanOverrideConfiguration.class, XXXApp.class})
public class DeviceResourceIT {
    @Autowired DeviceRepository deviceRepository;
    @Autowired DeviceService lotService;

    @Autowired private MappingJackson2HttpMessageConverter jacksonMessageConverter;
    @Autowired private ExceptionTranslator exceptionTranslator;

    private MockMvc mockMvc;
    private Logger log = LoggerFactory.getLogger(DeviceResourceIT.class);

    @PostConstruct
    void setup() {
        DeviceResource deviceResource = new DeviceResource(deviceService);
        mockMvc = MockMvcBuilders.standaloneSetup(deviceResource)
                                 .setControllerAdvice(exceptionTranslator)
                                 .setConversionService(createFormattingConversionService())
                                 .setMessageConverters(jacksonMessageConverter)
                                 .build();
    }

    @Test
    public void getLot() throws Exception
    {
        String lotID;
        String wrongLotID = "aRandomString";

        final List<DeviceRequestDTO> requests = Arrays.asList(
            new DeviceRequestDTO("l1", "ble1"),
            new DeviceRequestDTO("l2", "ble2"),
            new DeviceRequestDTO("l3", "ble3")
        );

        LotDTO lotDTO = new LotDTO(requests);

        MvcResult mvcResult = mockMvc.perform(post("/api/admin/lot")
                                                  .contentType(MediaType.APPLICATION_JSON)
                                                  .characterEncoding("utf-8")
                                                  .content(toJsonString(lotDTO)))
                                     .andDo(print())
                                     .andExpect(status().isOk())
                                     .andReturn();

        LotDTO returnedLotDTO = convertJsonBytes(mvcResult.getResponse().getContentAsByteArray(), LotDTO.class);
        lotID = returnedLotDTO.getId();
        log.info("{the lot id is : }" + lotID);

        // retrieve the Lot with the right lot ID
        mockMvc.perform(get("/api/admin/lot/{lot_id}", lotID))
               .andDo(print())
               .andExpect(status().isOk());


    }

    @AfterEach
    public void tearDown() {
        try {
            log.info("{}", deviceRepository.count());
            // Returns: 3

            deviceRepository.deleteAll();
            log.info("{}", deviceRepository.count());
            // Returns: 3
            // ... but we would expect to see 0, given the call to
            //     deleteAll() just above...

        } catch (Exception e) {
            Fail.fail(e.getMessage());
        }
    }

}

1 Ответ

0 голосов
/ 15 октября 2019

Это была странная ошибка для диагностики. Оказалось, что я неправильно реализовал isNew() (из Persistable<T>) и возвращал значение true.

В результате вызов SimpleJpaRepository#delete(T entity) выполняет эту проверку:

public void deleteAll(T entity)
   // [...]

   if (entityInformation.isNew(entity)) {
      return;
   }

   // actually delete...
   // [...]
}

Мои сущности возвращали isNew() = true, поэтому, естественно, хранилище просто пропускало все сущности и никогда не удаляло их. Между тем, deleteAllInBatch() не выполняет эту проверку.

Чтобы исправить это, я прекратил реализацию Persistable и вместо этого сделал мои сущности Serializable.

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