2012-03-22 43 views
16

Tôi đang chạy một kiểm tra JUnit đơn giản sẽ lặp lại một ứng dụng DAO. Vấn đề là tôi luôn luôn nhận được:Các kiểm tra JUnit luôn khôi phục các giao dịch

javax.persistence.RollbackException: Transaction marked as rollbackOnly 

Các thử nghiệm JUnit là:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:com/my/app/context.xml"} 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false) 
@Transactional 
public class PerformanceTest { 

    @Test 
    @Transactional(propagation= Propagation.REQUIRES_NEW) 
    @Rollback(false) 
    public void testMsisdnCreationPerformance() { 
     // Create a JPA entity 

     // Persist JPA entity 
    } 
} 

Như bạn có thể thấy tôi đang tuyên bố rõ ràng là không để rollback phương pháp này.

Hỗ trợ Spring JUnit luôn đặt rollback thành true?

Xin cảm ơn trước,

+0

Bạn nhận ngoại lệ ở đâu? Bạn có thể đăng stacktrace không? – nwinkler

Trả lời

10

Thật lạ khi muốn thử nghiệm thay đổi cơ sở dữ liệu của bạn và duy trì sửa đổi. Các thử nghiệm được coi là trực giao: không có kiểm tra nào phụ thuộc vào nhau. Hơn nữa, các thử nghiệm được coi là độc lập với thứ tự kiểm tra và thậm chí là idempotent.

Vì vậy, hoặc bạn muốn thay đổi cơ sở dữ liệu theo phương pháp setUp() và khôi phục thay đổi theo phương pháp tearDown(), hoặc bạn muốn thiết lập cơ sở dữ liệu thử nghiệm với một số giá trị tốt trong đó để kiểm tra.

Có thể tôi đang thiếu điều gì đó ở đây nhưng thông thường bạn không nên muốn điều đó.

+23

Nhưng đây không phải là câu hỏi. – Ralph

+7

@Ralph Nhưng đó vẫn là câu trả lời đúng. –

+6

Tôi có một lý do thực sự tốt tại sao không rollback một bài kiểm tra junit. Vì vậy, sau đó "câu trả lời đúng" không phải là bạn không nên làm điều đó. Câu trả lời đúng là ai đó có thể giải thích như thế nào. – user829237

39

Nó sẽ hoạt động, như bạn mong đợi, nhưng có thể bạn mở một giao dịch khác trong lớp của bạn đang được kiểm tra hoặc bạn có một tính năng/lỗi khác ở đâu đó.

Btw chú thích này nên enougth:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:com/my/app/context.xml"} 
@Transactional 
public class PerformanceTest { 

    @Test 
    @Rollback(false) 
    public void testMsisdnCreationPerformance() { 
     // Create a JPA entity 

     // Persist JPA entity 
    } 
} 

@See Spring Reference Chapter 9.3.5.4 Transaction management

+1

+1 để cung cấp câu trả lời chính xác theo nghĩa đen, nhưng tôi thích câu trả lời khác –

0

Tôi đồng ý câu trả lời của Ralph.

Tuyên truyền.REQUIRES_NEW tạo giao dịch mới và điều này có thể không khớp với tuyến giao dịch chính mà thử nghiệm đang chạy.

Trong kinh nghiệm đơn giản của tôi, chú thích @Transactional sẽ hoạt động đúng cách để xác định ngữ cảnh giao dịch trong đó mỗi thử nghiệm sẽ chạy, ủy quyền cho điều khoản cuộn ngược hiện tại cụ thể này (như Ralph).

Câu trả lời của Ralph hữu ích và đồng thời câu trả lời của Snicolas liên quan đến một trường hợp cụ thể về quản lý ngữ cảnh kiểm tra. Các idempotence là cơ bản cho các bài kiểm tra tích hợp và tự động, nhưng phải là những cách khác nhau để thực hiện chúng. Câu hỏi là, bạn có loại phương pháp nào? Và các phương pháp của người Pháp có hành vi gì?

[...] 
    @Transactional 

    public class Test { 

    @Test 
    @Rollback(false) 
    public void test() { 

    [...] 

Là, câu hỏi-mạch lạc cách đơn giản :)

6

Chỉ cần thêm chú thích Rollback và đặt cờ false.

@Test 
    @Rollback(false) 
1

Từ Tài liệu chính thức:

Theo mặc định, giao dịch thử nghiệm sẽ được tự động cuộn lại sau thúc kỳ thi tuyển; Tuy nhiên, giao dịch cam kết và rollback hành vi có thể được cấu hình khai báo thông qua @Commit và @Rollback chú thích

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html#integration-testing-annotations

@Commit chỉ ra rằng giao dịch cho một phương pháp thử nghiệm giao dịch nên được cam kết sau phương pháp thử đã hoàn thành. @Commit có thể được sử dụng làm thay thế trực tiếp cho @Rollback (sai) để thêm truyền đạt rõ ràng mục đích của mã.

+0

Điều gì đã gây nhầm lẫn với tôi là thử nghiệm sẽ cam kết txn ngay cả khi ngoại lệ bong bóng tất cả các con đường lên, nơi bình thường (@Transactional về kinh doanh lớp như trái ngược với phương pháp thử nghiệm) mà sẽ kích hoạt một rollback txn. –

+0

Chỉ dành cho ngoại lệ đã chọn. Bỏ chọn sẽ được cuộn lại tự động. https://stackoverflow.com/questions/3701376/rollback-on-every-checked-exception-whenever-i-say-transactional – harryssuperman

Các vấn đề liên quan