为什么Quarkus @TestTransaction不起作用?

发布于 2025-02-10 01:20:53 字数 1288 浏览 1 评论 0原文

我写了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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

凉风有信 2025-02-17 01:20:53

在处理器级别上,我已经将注释进行了注释

@Transactional(value = Transactional.TxType.REQUIRES_NEW)

它时,该注释

@TestTransaction

,当我更改为

@Transactional(value = Transactional.TxType.MANDATORY)

开始工作。

On processors level I have put annotation

@Transactional(value = Transactional.TxType.REQUIRES_NEW)

And this annotation disabled

@TestTransaction

When I changed to

@Transactional(value = Transactional.TxType.MANDATORY)

It started to work.

森林散布 2025-02-17 01:20:53

@TestTransaction只会在其范围内进行回滚。

如果您调用另一种用@transactional注释的方法,则不会撤消此提交。

示例

@Test
@TestTransaction
public void test() {
    client.persist();
}

在上面的示例中,如果持续方法没有一个 @transactional注释,则数据库中的更改将在测试()方法末尾回滚。

当我必须测试具有 @transactional注释的方法时,我要在进行的解决

方法是在测试软件包上创建一个类,并将所有所需的删除放在那里。这个想法是在需要干净表的测试开始时运行此删除方法。

就我而言,我在测试中使用了内存数据库中的一个,即H2。

package org.acme.tests;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;

@ApplicationScoped
public class CleanTables {

  @Inject
  EntityManager entityManager;

  @Transactional
  public void clean() {
    entityManager.createNativeQuery("DELETE FROM YOUR_SCHEMA.YOUR_TABLE_A").executeUpdate();

    entityManager.createNativeQuery("DELETE FROM YOUR_SCHEMA.YOUR_TABLE_B").executeUpdate();
  }

}

交易注释

只是为了澄清,用@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

@Test
@TestTransaction
public void test() {
    client.persist();
}

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.

package org.acme.tests;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.transaction.Transactional;

@ApplicationScoped
public class CleanTables {

  @Inject
  EntityManager entityManager;

  @Transactional
  public void clean() {
    entityManager.createNativeQuery("DELETE FROM YOUR_SCHEMA.YOUR_TABLE_A").executeUpdate();

    entityManager.createNativeQuery("DELETE FROM YOUR_SCHEMA.YOUR_TABLE_B").executeUpdate();
  }

}

Transactional annotation

Just to clarify, all methods annotated with @Transactional will send a commit when they finish successfully.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文