В моих интеграционных тестах 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());
}
}
}