为什么Quarkus @TestTransaction不起作用?
我写了Quarkus的测试,并期望测试后,测试后数据库中没有任何新的RAW。但是在每次测试后都会出现RAW。
Quarkus 2.10.0 Junit 5 Java 17
@QuarkusTest
public class IssueChangeConsumerTests {
@Inject
private JiraChangeConsumer sut;
@Inject
private JiraStatusDao dao;
@org.junit.jupiter.api.Test
@TestTransaction()
public void test(){
JiraStatusDTO statusDTO = new JiraStatusDTO(ISSUE_ID, CHANGE_ID, PROJECT_KEY, ISSUE_NUM, OLD_STATUS, NEW_STATUS, CHANGE_DATE_TIME);
JiraChangeDTO change = new JiraChangeDTO(statusDTO, null, null);
sut.consumeJiraChange(change);
List<JiraStatusChange> issuesChanges = dao.getIssuesChanges(PROJECT_KEY, List.of(ISSUE_NUM));
assertThat(issuesChanges)
.extracting(
JiraStatusChange::getIssueId,
JiraStatusChange::getChangeId,
JiraStatusChange::getProjectKey,
JiraStatusChange::getIssueNum,
JiraStatusChange::getChangeDateTime,
JiraStatusChange::getNewStatus,
JiraStatusChange::getOldStatus)
.contains(new Tuple(ISSUE_ID, CHANGE_ID, PROJECT_KEY, ISSUE_NUM, dt, NEW_STATUS, OLD_STATUS));
}
}
I wrote the test for Quarkus and expect that after test there were not any new raws in database after Test. But raws appear after every test.
Quarkus 2.10.0
JUnit 5
Java 17
@QuarkusTest
public class IssueChangeConsumerTests {
@Inject
private JiraChangeConsumer sut;
@Inject
private JiraStatusDao dao;
@org.junit.jupiter.api.Test
@TestTransaction()
public void test(){
JiraStatusDTO statusDTO = new JiraStatusDTO(ISSUE_ID, CHANGE_ID, PROJECT_KEY, ISSUE_NUM, OLD_STATUS, NEW_STATUS, CHANGE_DATE_TIME);
JiraChangeDTO change = new JiraChangeDTO(statusDTO, null, null);
sut.consumeJiraChange(change);
List<JiraStatusChange> issuesChanges = dao.getIssuesChanges(PROJECT_KEY, List.of(ISSUE_NUM));
assertThat(issuesChanges)
.extracting(
JiraStatusChange::getIssueId,
JiraStatusChange::getChangeId,
JiraStatusChange::getProjectKey,
JiraStatusChange::getIssueNum,
JiraStatusChange::getChangeDateTime,
JiraStatusChange::getNewStatus,
JiraStatusChange::getOldStatus)
.contains(new Tuple(ISSUE_ID, CHANGE_ID, PROJECT_KEY, ISSUE_NUM, dt, NEW_STATUS, OLD_STATUS));
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在处理器级别上,我已经将注释进行了注释
它时,该注释
,当我更改为
开始工作。
On processors level I have put annotation
And this annotation disabled
When I changed to
It started to work.
@TestTransaction只会在其范围内进行回滚。
如果您调用另一种用@transactional注释的方法,则不会撤消此提交。
示例
在上面的示例中,如果持续方法没有一个 @transactional注释,则数据库中的更改将在测试()方法末尾回滚。
当我必须测试具有 @transactional注释的方法时,我要在进行的解决
方法是在测试软件包上创建一个类,并将所有所需的删除放在那里。这个想法是在需要干净表的测试开始时运行此删除方法。
就我而言,我在测试中使用了内存数据库中的一个,即H2。
交易注释
只是为了澄清,用@transactional注释的所有方法将在成功完成时发送提交。
The @TestTransaction will only rollback commits made inside it's scope.
If you call another method that is annotated with @Transactional, this commit won't be undone.
Example
In the above example, if the persist method doesn't have one @Transactional annotation, the changes in the database will suffer rollback in the end of the test() method.
Workaround
One workaround I'm doing, when I must test methods that have the @Transactional annotation, is to create one class on the test package and put all the DELETEs needed there. The idea is to run this deletion method on the beginning of the tests that need clean tables.
In my case I'm using one in memory database on my tests, that is H2.
Transactional annotation
Just to clarify, all methods annotated with @Transactional will send a commit when they finish successfully.