【发布时间】:2021-03-16 08:47:36
【问题描述】:
我正在尝试为 java spring 项目编写集成测试。
在代码中的某个时刻,我需要检查 customer.getId(),其中 ID 由 @Formula 注释创建,如下所示:(请记住 Customer_Id 是我的自动递增主键)
@Formula("Customer_Id")
private int id
我使用lombok 来生成getter 和setter 方法。我的测试数据库是 H2,我使用 Junit5 进行测试。我面临的问题是我无法测试getId() 的行为,因为当我用@DataJpaTest 注释测试时它总是0。我使它与 @SpringBootTest 一起工作,但我想坚持切片测试。
有没有办法让@DataJpaTest 与@Formulas 一起工作?
提前致谢。
@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
}
}
【问题讨论】:
-
不清楚为什么需要以如此奇怪的方式复制
customerId?你想达到什么目标? -
好点。我的客户表不遵循命名约定,但我仍然需要有公式,以便我可以查询一个名为 id 的字段,即使我的表没有它。
-
您只需将
customerId重命名为id即可,因为您通过@Column注释明确指定了列名。 -
@SternK 在这个人为的示例中,可以避免公式 - 但是对于仍然需要测试的复杂公式并且 DataJpaTest 用作切片测试会发生什么?
标签: spring hibernate spring-data-jpa spring-data junit5