Unit testing Spring启动,测试后事务不回滚

Unit testing Spring启动,测试后事务不回滚,unit-testing,spring-boot,spring-data,spring-data-jpa,spring-transactions,Unit Testing,Spring Boot,Spring Data,Spring Data Jpa,Spring Transactions,我正在为我的服务编写单元测试。问题在于,测试完成后,事务不会通过spring引导自动回滚 以下是我的测试: @SpringApplicationConfiguration(classes = { TestApplicationConfiguration.class, TestDataSourceConfiguration.class }) @RunWith(SpringJUnit4ClassRunner.class) public class BoardServiceTest { @Autow

我正在为我的服务编写单元测试。问题在于,测试完成后,事务不会通过spring引导自动回滚

以下是我的测试:

@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);
    }
}
正如您所看到的,调用此方法时会打开新事务。 在我的调试控制台中,更新完成后,我看到以下信息:

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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
我不明白为什么hibernate在db中创建新的实体,尽管我正在更新现有的实体。
因此,可能这就是这种行为的原因?

您需要在事务注释中提供rollbackor参数
@Transactional(propagation=propagation.REQUIRES_NEW,rollbackor=Exception.class)
默认回滚仅适用于带有事务注释的未检查异常(RuntimeException或Error实例)

如果您正在编写单元测试,如果您模拟数据库中存储内容的类,会不会更容易些?(就像一个存储库,entitymanager,…)@g00glen00b,因为spring管理测试中的事务,所以我不想模拟其他组件。关于在测试中回滚。您可以使用@TransactionConfiguration(defaultRollback=true)注释您的测试类。这将使事务始终回滚。还使用@Transactional注释测试类,以确保所有测试都将rollback@DanielDiehl,您好,@TransactionConfiguration(defaultRollback=true)已弃用。还有其他的吗?@i-domshchikov,从Spring4.2开始,您可以将类指定为@Rollback(true)和@Transactional。
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 (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)