Java Spring 프로젝트에 대한 통합 테스트를 작성하려고합니다. 코드의 어느 시점에서 나는 customer.getId()
ID가 @Formula
다음과 같은 주석으로 생성되는 위치 를 확인해야합니다 . ( Customer_Id
내 자동 증가 기본 키임을 기억하십시오 )
@Formula("Customer_Id")
private int id
lombok
getter 및 setter 메서드를 생성 하는 데 사용 합니다. 테스트 용 데이터베이스는 H2이고 테스트에 사용 Junit5
합니다. 내가 직면 한 문제는 getId()
항상 0
테스트에 주석을 달 때 행동을 테스트 할 수 없다는 것 입니다 @DataJpaTest
. 나는 그것을 작동하도록 @SpringBootTest
만들었지 만 슬라이스 테스트를 고수하고 싶습니다.
s로 @DataJpaTest
작업 하는 방법이 @Formula
있습니까?
미리 감사드립니다.
@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
}
}
사용하는 경우 @DataJpaTest
기본적으로 데이터 JPA 테스트는 트랜잭션이며 각 테스트가 끝날 때 롤백됩니다 . 자세한 내용은 Spring Framework 참조 문서 의 관련 섹션 을 참조하십시오.
사용 @SpringBootTest
하는 경우는 그렇지 않습니다. 그러나 @Transational
클래스에 추가 하면 테스트가 실패합니다.
해결책:
@DataJpaTest
@Transactional(propagation = Propagation.NOT_SUPPORTED)
class MyClassTests {
...
Propagation.NOT_SUPPORTED는 물리적 트랜잭션이 존재하면 계속하기 전에 일시 중단됨을 나타냅니다. 이 실제 거래는 마지막에 자동으로 재개됩니다. 이 트랜잭션이 재개 된 후에는 롤백 (실패한 경우)하거나 커밋 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다