我正在做一些JUnit测试,我只需要执行一次SQL脚本,但似乎它每次测试都执行一次。
我正在使用下一个注释:
-主要:
@SpringBootApplication
@EnableTransactionManagement
- 测试类:
@Sql({ "classpath:insertMessage.sql" })
@Transactional
public class ServiceTest {
我错过了什么?
如果您希望仅使用脚本影响单个测试,只需添加方法即可。
例如
@Sql({ "classpath:insertMessage.sql" })
@Test
public void myExtremlyBadTestMethodNamingConventionTest() {
如果您希望在单个测试类的所有测试之前执行指定的测试。这是它变得棘手的地方 -
首先,您可以考虑将@SQL添加到@BeforeClass,但这是不可能的,因为@SQL不支持@BeforeClass(或@Before)。
接下来,您可能会发现@Commit
注释,这意味着您可以提交使用Test进行的所有更改。 (@Transaction
的默认行为是在测试后回滚所有更改)现在,您可以考虑,在所有其他测试之前执行@Commit
单个虚拟测试?
不,请不要走这条路。
JUnit不保证测试执行的顺序。 (这是设计的)因为您的测试不应该依赖于其他测试的结果。
它们应该相互独立。为什么?一个优点是,然后可以并行执行测试。而且,你永远不会想要一个新的测试来打破令人兴奋的测试,它只是一个等待发生的维护噩梦。 (#真实的故事)
此外,在这种情况下,您希望在所有测试之前执行指定的脚本,您可以将import.sql文件添加到测试的资源中。 Spring Boot会在测试前自动检查它并为您执行。换句话说,它将为您的所有测试设置特定状态的数据库。