2

Я пишу модульные тесты для моего обслуживания. Проблема в том, что после завершения теста транзакции автоматически не откатываются весной.Весенний ботинок, сделка не откат после теста

Вот мои тесты:

@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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 

Я не понимаю, почему спящий режим создать новый объект в БД, хотя я обновление существующего. Итак, может быть, это причина такого поведения?

+0

Если вы пишете единичный тест, не было бы проще, если бы вы издевались над классами, хранящими данные в базе данных? (Как репозиторий, entitymanager, ...) – g00glen00b

+0

@ g00glen00b, Ну, поскольку весна управляет транзакциями в тестах, поэтому я не хочу издеваться над другими компонентами. –

+0

Относится к откату в тесте. Вы можете аннотировать тестовый класс с помощью ** @ TransactionConfiguration (defaultRollback = true) **. Это сделает транзакцию всегда откатом. Также аннотируйте тестовый класс с помощью ** @ Transactional **, чтобы гарантировать, что все тесты будут отменены. –

ответ

0

Вам необходимо предоставить rollbackFor paramter в вашей транзакционной аннотации. @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) Откат по умолчанию работает только для исключенных исключений (экземпляр RuntimeException или Error) с аннотацией к транзакции