java - 每次junit测试后如何清理h2 db?
问题描述
我正在做junit测试,在每个测试用例之前添加一些用户。代码是:
@BeforeEach
void setUp() {
saveUser();
saveEntry();
}
@Test
void saveUser() {
User user = new User();
user.setUserId(null);
user.setUsername("John");
user.setEmail("john@foo.com");
user.setPassword("password");
userService.saveUser(user);
}
@Test
void saveEntry() {
Entry entry = new Entry();
entry.setText("test text");
entry.setUserId(1L);
entryService.saveEntry(entry);
}
如您所见,我正在使用服务层中的方法来创建条目和用户。如果我一个一个地运行测试没有问题。但是当我运行所有测试时,db 没有返回 1 个项目并返回多个项目,因此会发生异常。
我需要在每次测试后使用 @AfterEach 注释清理 h2 db,但我的代码中没有和 delete 方法来调用。如何清理 H2 数据库?
解决方案
除了正确的@J Asgarov 答案之外,spring-boot
如果您想在每次测试之前和之后执行一些操作(更具体地说是在方法之前@Before
和之后@After
),您可以使用@Sql
注释来执行特定sql
脚本,例如从测试资源中执行特定脚本。
@Sql("init.sql")
@Sql(scripts = "clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
public class TestClass
}
它可能对 很方便sequences
,因为他们不关心回滚。
关于@Transactional
@Mark Bramnik 提到的要小心,因为事务跨越整个测试方法,因此您无法验证事务边界的正确性。
推荐阅读
- python - python字符串索引超出范围
- mongodb - 错误:尝试在主机“localhost:27017”上运行命令“saslStart”时出现网络错误
- ios - 如何修复 Apple Watch 页面控制器中缺少的界面控制器?
- php - “ns1”和“tns”标签之间的区别
- python - 在scrapy中使用meta传递数据
- excel - 根据单元格值移动形状
- androidx - androidx.work.impl.WorkManagerInitializer:java.lang.ClassNotFoundException:路径上的“androidx.work.impl.WorkManagerInitializer”:/data/app/app-2.apk
- node.js - 多个 2dsphere 索引,不确定在哪个上运行 geoNear
- machine-learning - 如何使用 cross_val_score 来拟合我的测试数据?
- javascript - 如何解决“找不到商店”的问题?