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

使用@DataJpaTest时,Hibernate@Formula在Spring启动测试中不起作用

易阳朔
2023-03-14

我正试图为一个java spring项目编写一个集成测试。在代码中的某个时候,我需要检查客户。getId(),其中ID由如下注释创建:(请记住,Customer\u ID是我的自动递增主键)

java prettyprint-override">@Formula("Customer_Id")
private int id

我使用lombok生成getter和setter方法。我的测试数据库是H2,我使用Junit5进行测试。我面临的问题是,我无法测试getId()行为,因为当我用DataJpaTest注释测试时,它总是0。我使用SpringBootTest使其工作,但我希望坚持切片测试。

有没有办法让@DataJpaTest@公式一起工作?

提前感谢。

@Entity(name="customers")
@Table(name="Customers")
@Getter
@Setter
@NoArgsConstructor
public class Customer{

    @Formula("Customer_Id")
    private int id;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="Customer_Id", unique=true, nullable=false, precision=10)
    private int customerId;
}
// if it is annotated with @SpringBootTest the tests passes
@DataJpaTest
@ActiveProfiles("test")
@EnableJpaAuditing
class MyClassTests {

    @Autowired
    private CustomerRepository customerRepository;

    @Test
    void given_a_customer_should_have_customerId_and_id_equal(){
        Customer customer = new Customer();
        customerRepository.save(customer);
        // if i don't call findOneByCustomerId test fails for both @SpringBootTest and @DataJpaTest
        customer = customerRepository.findOneByCustomerId(customer.getCustomerId());
        assertEquals(customer.getCustomerId(), customer.getId()); // expected: 1, actual 0
    }
}

共有1个答案

施飞昂
2023-03-14

如果使用DataJpaTest

默认情况下,数据JPA测试是事务性的,并在每次测试结束时回滚。有关更多详细信息,请参阅Spring Framework参考文档中的相关部分

如果您使用@SpringBootTest,情况并非如此。但是,如果您将@Transational添加到您的类中,测试将失败。

解决方案:

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

传播NOT_SUPPORTED表示,如果存在物理事务,则它将在继续之前暂停。此物理事务将在结束时自动恢复。恢复此事务后,可以回滚(在失败的情况下)或提交。

 类似资料:
  • 我想使用自定义的<code>TestExecutionListener</code>和<code>SpringJUnit4ClassRunner</code>结合使用,在我的测试数据库上运行Liquibase模式设置。我的<code>TestExecutionListener</code>工作正常,但当我在类上使用注释时,测试中DAO的注入不再工作,至少实例为空。 侦听器相当简单: 日志中没有错误

  • 我有单向相关实体: 以及以下测试: 如果不是从测试中调用此代码,则效果很好,但在测试中,我得到了一个例外,即建议没有被书籍删除。 此外,我尝试从为Hibernate查询记录的sql中获取任何信息,但我看不到此测试的任何语句。 我不想对实体使用双向链接,只想了解如何解决这个具体问题或以某种方式调试它。

  • 我试图理解为什么我不能自动生成一个类存储库,但我可以在同一个包中自动生成一个接口存储库,用于同一个测试。当我启动应用程序时,相同的存储库按预期工作。 存储库接口: 在经历了一次同样的错误后,我试图在配置中找到一些细节,或者测试是什么导致了这个问题。另一种可能是不支持类存储库。

  • pm2-init.sh文件: 这不起作用,所以我尝试使用,如下所示:首先,创建一个脚本,并将其命名为 然后打开编辑器:

  • 我不能使用spring boot 2.1.0.M4和Junit5和测试我的spring crud存储库。我正在使用下面的spring crud存储库接口。 这是我的单元测试类 这是我的pom.xml 我只想知道成功运行测试的正确注释集是什么。我尝试使用不同的组合 如果我只是使用@datajpatest和@runwith(Springrunner.class),我会得到以下错误: 附言。只想提一下,