【发布时间】:2020-07-11 18:37:17
【问题描述】:
我有这个问题导致我在使用事务上下文运行测试时不使用JdbcTestUtils。
如果我用@Transactional 注释包装我的测试并使用JdbcTemplate/DataSource,看起来生产代码中使用的事务和JdbcTestUtils 使用的事务不一样,所以如果我在then 部分查询数据库断言失败。
这是一个伪测试:
@SpringBootTest
class TestClass {
@Autowired
private WebApplicationContext context;
@BeforeEach
void setup() {
RestAssuredMockMvc.webAppContextSetup(context, springSecurity());
}
@Test
@Transactional
@DisplayName("test1")
void test1(@Autowired DataSource dataSource) {
//given
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
assertThat(countRowsInTable(jdbcTemplate, "some_tbl")).isEqualTo(1);
//when
// Execute app code here that adds a record to some_tbl
//then
assertThat(countRowsInTable(jdbcTemplate, "some_tbl")).isEqualTo(2); //<- Assertion fails.
}
作为一种解决方法,我需要使用 Spring 上下文测试存储库来检索测试中的数据,但这感觉是个坏主意,我需要维护这些存储库。
您将在下面找到一个简单的 spring-boot 项目来显示该问题。 https://github.com/Marek00Malik/JdbcTestUtils-sample
【问题讨论】:
-
您可以在此处添加您正在测试的实际应用代码吗?断言也不应该是表中的两条记录吗?你从一个开始,在测试期间添加一个?
-
你说得对,应该是描述中所说的2。生产代码只是存储单个新记录的简单方法。我正在使用 rest api 访问它,但这应该没有什么不同。该功能按预期工作,但我需要以不同的方式测试添加(而不是通过 JdbcTestUtils),因为我希望在测试完成后回滚更改。如果您需要一个示例 repo,我可以创建一个,但我看不出它有任何意义。这不是我第一次遇到这个问题。
-
不过,很高兴看到 简单方法 是什么。所以你的基本问题是你不能用
JdbcTemplate为测试准备测试数据还是不同? -
github.com/Marek00Malik/JdbcTestUtils-sample 手头问题的示例。如果我将在 JdbcTestUtil 之前查询数据库,则一项测试有效。
-
请注意,我知道使用 saveAndFlush,但此解决方案增加了额外的性能,因为您需要将 jpa 上下文刷新到磁盘。因此,如果可以使用传统的保存方法,建议使用此方法。
标签: java spring spring-data-jpa spring-test