【问题标题】:Spring Tests Do Not Store Data in DatabaseSpring 测试不将数据存储在数据库中
【发布时间】:2015-04-16 23:06:17
【问题描述】:

我正在使用 Spring 为游戏运行一些测试,但由于某种原因,sql 文件中的数据没有被持久化到数据库中。这是我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {HibernateConfigTest.class})
@Transactional
@Sql(scripts = {"api_routes.sql",
                "profile.sql",
                "status.sql",
                "user.sql",
                "game_token.sql",
                "game.sql",
                "message.sql"},
    executionPhase = ExecutionPhase.BEFORE_TEST_METHOD)
@Sql(scripts = "delete_data.sql", 
    executionPhase = ExecutionPhase.AFTER_TEST_METHOD)
public class GameDaoTest {
    @Autowired
    private GameDao gameDao;

    @Test
    public void testGetGamesByTokenId() {
        assertEquals(36, gameDao.getGamesByTokenId(null).size());
    }
}

当我运行测试时,测试成功。然而,当我去查看数据库时,在测试期间没有任何数据存在。在我不知情的情况下,Spring 似乎正在运行一个内存数据库。

有没有办法确保数据被持久化到数据库中?

【问题讨论】:

  • 我对 Spring 平台的了解还很远,但我想知道 @Sql(scripts = "delete_data.sql", executionPhase = ExecutionPhase.AFTER_TEST_METHOD)
  • 您对此有何疑惑?测试通过就好了。

标签: java spring hibernate dao spring-test


【解决方案1】:

config = @SqlConfig(transactionMode = ISOLATED) 添加到@SQL 注释,以便在单独的事务中运行sql。

例子:

@Sql(
    scripts = "...",
    config = @SqlConfig(transactionMode = ISOLATED),
    executionPhase = ExecutionPhase.BEFORE_TEST_METHOD
)

Relevant Spring Documentation

【讨论】:

  • 这样做的问题是测试完成后数据没有被删除。
  • 这样可行,但我还需要将该配置语句添加到删除 sql 注释中。
【解决方案2】:

您可以使用

将您的事务设置为不回滚
@TransactionConfiguration(defaultRollback = false)

【讨论】:

    猜你喜欢
    • 2014-06-24
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2021-06-24
    • 2018-02-02
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多