在春季启动时,我正在尝试创建我的第一个事务测试,但是trasaction不起作用。
@TestPropertySource(locations = "classpath:test.properties")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringJUnit4ClassRunner.class)
//@RunWith(SpringRunner.class)
@Transactional
@TestExecutionListeners(
mergeMode = TestExecutionListeners.MergeMode.MERGE_WITH_DEFAULTS,
listeners = {TransactionalTestExecutionListener.class}
)
public class IntegrationTests
{
@Autowired
TemperatureLogRepository temperatureLogRepository;
@Test
@SqlGroup({
@Sql(
executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD,
config = @SqlConfig(transactionMode = ISOLATED),
scripts = "classpath:sqls/insertRecords2.sql"
)
})
public void firstRepoTest() throws SQLException
{
assertThat(temperatureLogRepository.getFullList().size()).isEqualByComparingTo(0);
}
}
我知道SqlGroup不是必需的,但会添加更多文件。
我现在有:
getFullList()
方法可以读取它并返回正确的数据。我不确定他们是否在同一笔交易中运行。是否可以在getFullList()
方法运行之前将数据提交给数据库?
我需要什么:
@Sql
将数据插入到交易中。getFullList()
从交易中读取数据。答案 0 :(得分:1)
来自Spring Testing - Executing SQL scripts declaratively with @Sql:
脚本执行阶段
默认情况下,SQL脚本将在相应的测试之前执行 方法。但是,如果需要执行一组特定的脚本 在测试方法之后 - 例如,清理数据库状态 - 可以使用@Sql中的executionPhase属性,如下所示 例。请注意,ISOLATED和AFTER_TEST_METHOD是静态的 分别从Sql.TransactionMode和Sql.ExecutionPhase导入。
@Test
@Sql(
scripts = "create-test-data.sql",
config = @SqlConfig(transactionMode = ISOLATED) ) @Sql(
scripts = "delete-test-data.sql",
config = @SqlConfig(transactionMode = ISOLATED),
executionPhase = AFTER_TEST_METHOD )
public void userTest {
// execute code that needs the test data to be committed
// to the database outside of the test's transaction
}
相关问题:How to execute @Sql before a @Before method
<强>更新强>
从@SqlConfig
移除@Sql
:
config = @SqlConfig(transactionMode = ISOLATED)
或改为:
config = @SqlConfig(transactionMode = TransactionMode.INFERRED)
SQL脚本在不支持回滚的单独事务中运行:
org.springframework.test.context.jdbc.SqlConfig.TransactionMode.ISOLATED
表示SQL脚本应始终以新的方式执行, 将立即提交的孤立交易。