Я пишу модульные тесты для моего обслуживания. Проблема в том, что после завершения теста транзакции автоматически не откатываются весной.Весенний ботинок, сделка не откат после теста
Вот мои тесты:
@SpringApplicationConfiguration(classes = { TestApplicationConfiguration.class, TestDataSourceConfiguration.class })
@RunWith(SpringJUnit4ClassRunner.class)
public class BoardServiceTest {
@Autowired
private UserService userService;
@Autowired
private CardService cardService;
@Autowired
private BoardCardService boardCardService;
@Autowired
private BoardService boardService;
@Autowired
private CommonBoardService commonBoardService;
@Autowired
private AuthorityService authorityService;
@Test(expected = CommonException.class)
@Transactional
public void testCreateBoardStatusAFK() {
final User admin = userService.findUserById(1l);
admin.setCurrentBoard(null);
Board board = boardService.startBoard(admin);
assertEquals(board, admin.getCurrentBoard());
// Board has status IN_PROGRESS, current time < timeToComplete
board.setSelectedCardsCount(boardService.getDefaultCardsToSelectCount() - 1);
board.setTimeToComplete(DateUtils.addHours(new Date(), boardService.getDefaultMinsToComplete()));
board = commonBoardService.save(board);
board = boardService.startBoard(admin);
assertEquals(admin.getCurrentBoard().getStatus(), Board.IN_PROGRESS);
// Board has status IN_PROGRESS, current time > timeToComplete
board.setTimeToComplete(DateUtils.addHours(new Date(), -1));
board = commonBoardService.save(board);
board = boardService.startBoard(admin);
assertEquals(admin.getCurrentBoard().getStatus(), Board.AFK);
}
}
После выполнения теста, соответствующая таблица в тестовой БД заполняется новой записью.
Пожалуйста, скажите, как решить эту проблему?
Update:
Вот реализация моего метода службы, который вызывается во время теста:
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public Board update(Board board, Date finishedDate, Integer status) {
board.setStatus(status);
board.setFinishedDate(finishedDate);
return boardRepository.save(board);
}
As, вы можете увидеть, новая транзакция открывается, когда этот метод называется. В моей отладки консоли, я вижу следующую информацию, после завершения обновления:
Hibernate: select nextval ('boards_id_seq')
Hibernate: insert into boards (created_date, updated_date, cards_to_hold, cards_to_select, finished_date, holded_cards_count, selected_cards_count, started_date, status, time_to_complete, time_to_next_board, user_id, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Я не понимаю, почему спящий режим создать новый объект в БД, хотя я обновление существующего. Итак, может быть, это причина такого поведения?
Если вы пишете единичный тест, не было бы проще, если бы вы издевались над классами, хранящими данные в базе данных? (Как репозиторий, entitymanager, ...) – g00glen00b
@ g00glen00b, Ну, поскольку весна управляет транзакциями в тестах, поэтому я не хочу издеваться над другими компонентами. –
Относится к откату в тесте. Вы можете аннотировать тестовый класс с помощью ** @ TransactionConfiguration (defaultRollback = true) **. Это сделает транзакцию всегда откатом. Также аннотируйте тестовый класс с помощью ** @ Transactional **, чтобы гарантировать, что все тесты будут отменены. –