当前位置: 首页 > 知识库问答 >
问题:

Spring存储库:即使缺少@Transactional,Junit测试也会在自定义删除上成功

龚昊然
2023-03-14

我有一个Spring存储库,它有这样一个方法:

 Long deleteByStatusAndTriggeredBefore(String status, Timestamp triggered);

在Junit测试中测试此方法时,它确实按预期工作。

@DataJpaTest
public class AlertRepositoryTest {

    @Autowired
    @Qualifier("alertRepository")
    private AlertRepository underTest;

    @AfterEach
    void tearDown(){
        underTest.deleteAll();
    }

    @Test
    void testUpdateAndDelete() {
        Timestamp triggered = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
        Timestamp fixed = java.sql.Timestamp.valueOf("2012-09-23 10:10:10.0");

        Alert alert1 = new Alert("FIXED", "event1", 0L, 0L, triggered, fixed, "domain1", "service1", "metric1", "context1", 1L, 1L);
        Alert alert2 = new Alert("FIXED", "event2", 0L, 0L, triggered, fixed, "domain2", "service2", "metric2", "context2", 1L, 1L);

        underTest.save(alert1);
        underTest.save(alert2);
        
        // some other assertions ...

        // As expected, the elements get deleted and the database is empty
        Timestamp deletion = java.sql.Timestamp.valueOf("2019-09-23 10:10:10.0");
        underTest.deleteByStatusAndTriggeredBefore("FIXED", deletion);
        Page<Alert> alertReturned = underTest.findByStatus("FIXED", Pageable.unpaged());
        assertThat(alertReturned.getContent().size()).isEqualTo(0);  

    }
}

然而,删除在我们的生产数据库上不起作用。为了让它在生产数据库上工作,我们必须在存储库中的方法中添加@Transactional注释

@Transactional
Long deleteByStatusAndTriggeredBefore(String status, Timestamp triggered);

这是一个问题,因为测试可行,但在生产中不起作用。当缺少事务注释时,是否可能使此测试失败?测试配置为在内存H2数据库上运行。

共有1个答案

后阳炎
2023-03-14

它在测试中工作的原因是@DataJpaTest注释包含@Transactional元注释。因此整个测试方法都覆盖了一个事务,这允许AlertRepository方法在没有错误的情况下运行。

如果要使其在测试中失败,可以重写事务注释,如下所示:

DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyNonTransactionalTests {

    // ...

}

有关此行为的更多信息,请参阅文档。

 类似资料:
  • 我正在为Junit编写测试,以测试我编写的删除函数: 此方法适用于同时具有前后节点的双链接列表。 问题是:我们的大学将针对我们编写的测试运行错误代码,以确定我们是否编写了足够的测试来捕获错误代码和异常。 我知道他们将运行的两个测试,但不知道错误的含义。 > 失败:缺少逻辑 故障:缺少NextNodeRepairLogic 这是我没有考虑的两个测试,因为我无法理解这些错误的含义。有人知道这些错误可能

  • 首先,我是Spring Hibernate开发的新手。遵循了很多教程书籍,我创建了一个主要基于Spring、Hibernate标准的示例应用程序,我已经开始为Repository(DAO)方法编写一些测试用例,即查找、查找、保存、删除。 当我执行测试类时,这真是太疯狂了,并不是所有的测试用例都能正确地为ex执行。尤其是find 当我完全执行以上所有测试用例时 甚至更新测试用例的行为也很奇怪,因为在

  • 在我的项目中有几个实体具有相同的属性(对于示例'name'),所以,有可能创建一个存储库,其中使用自定义的select(实体)?因此,我从JpaRepository扩展了我的存储库,我扩展了MyCustomJpaRepository,MyCustomJpaRepository也扩展了JpaRepository,使其能够从JpaRepository授予基本功能? TKS

  • 我的应用程序无法启动,因为spring看不到bean。 我试图运行mu应用程序,并添加创建的用户到数据库。我不知道如何创建丢失的bean。我发现界面上方必须有注释@repository,所以我放置了它,但它仍然不起作用。 我想运行我的应用程序,并添加用户到数据库。

  • 问题内容: 问题: 即使我从Maven存储库中复制了依赖项,也不会下载。 当我将鼠标悬停在Eclipse中的依赖项上时,它会发出警告:“ ”。 当我尝试或警告时:“ ”。 尝试过: 将jar下载到文件夹中,然后在编辑器中刷新。 当我或它似乎忽略它。 运行中。 与或相同。 深入: 该依赖关系 存在 于Maven存储库中(版本也是正确的)。 使用Eclipse EE Neon 4.6.3,Apache