Tôi đang cố gắng xây dựng một số thử nghiệm xung quanh một số thực thể được kiểm toán. Vấn đề của tôi là envers chỉ kiểm toán trên một giao dịch cam kết.Thử nghiệm tích hợp với Hibernate Envers
Tôi cần tạo/chỉnh sửa một số đối tượng thử nghiệm, cam kết giao dịch và sau đó kiểm tra các sửa đổi.
Cách tiếp cận tốt nhất để thử nghiệm tích hợp với envers là gì?
Cập nhật: Đây là một lớp học thử nghiệm thực sự không tốt, không xác định về những gì tôi muốn đạt được. Tôi muốn thực hiện việc này mà không cần dựa vào thứ tự của các phương pháp thử nghiệm
Trước tiên hãy tạo tài khoản và account_transaction trong một giao dịch duy nhất. Cả hai mục được kiểm tra đều dành cho sửa đổi 1.
Lần thứ hai cập nhật account_transaction trong giao dịch mới. Mục được kiểm tra đang được sửa đổi 2.
Thứ ba, tải tài khoản đã được kiểm tra tại bản sửa đổi 1 và làm điều gì đó với nó.
@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/testApplicationContext.xml"})
public class TestAuditing {
@Autowired
private AccountDao accountDao;
@PersistenceContext
private EntityManager entityManager;
@Test
@Rollback(false)
public void first() {
Account account = account("Test Account", "xxxxxxxx", "xxxxxx");
AccountTransaction transaction = transaction(new Date(), Deposit, 100, "Deposit");
account.setTransactions(newArrayList(transaction));
accountDao.create(account);
}
@Test
@Rollback(false)
public void second() {
Account account = accountDao.getById(1L);
AccountTransaction transaction = account.getTransactions().get(0);
transaction.setDescription("Updated Transaction");
accountDao.update(account);
}
@Test
public void third() {
AuditReader reader = AuditReaderFactory.get(entityManager);
List<Number> accountRevisions = reader.getRevisions(Account.class, 1L);
//One revision [1]
List<Number> transactionRevisions = reader.getRevisions(AccountTransaction.class, 1L);
//Two revisions [1, 2]
Account currentAccount = accountDao.getById(1L);
Account revisionAccount = (Account) reader.createQuery().forEntitiesAtRevision(Account.class, 1).getSingleResult();
System.out.println(revisionAccount);
}
Kiểm tra [this] (http://nurkiewicz.blogspot.com/2011/11/spring-pitfalls-transactional-tests.html) quảng cáo tự quảng cáo không biết xấu hổ. –
Cảm ơn bạn đã trả lời Tomasz, tôi vẫn không chắc chắn cách giải quyết vấn đề của tôi từ bài đăng trên blog của bạn. Tôi không thực sự có một vấn đề với các mặt tích cực sai từ tải chậm vv, nhiều hơn với thực sự cam kết một số giao dịch để thiết lập một số dữ liệu kiểm tra kiểm toán. Có lẽ tôi bị mất một cái gì đó rõ ràng trong bài viết của bạn mặc dù? –
Vâng, hãy cuộn bài viết của tôi xuống 'DbResetRule' - ý tưởng của tôi là tránh sử dụng các bài kiểm tra' @ Transactional' JUnit và chỉ cho phép mã của bạn cam kết và các giao dịch rollback. Rõ ràng điều này làm cho các bài kiểm tra không lặp lại và mong manh. Nhưng thay vì quay trở lại những thay đổi, tôi đề nghị bán phá giá cơ sở dữ liệu và khôi phục lại nó trước/sau mỗi lần kiểm tra. Mã là ở Scala, nhưng đây chỉ là một ý tưởng chung. Hãy cho tôi biết nếu đây là những gì bạn đang tìm kiếm vì vậy tôi sẽ xây dựng thêm một chút trong câu trả lời riêng biệt. –