2012-01-13 7 views
5

Trong thử nghiệm JUnit trong ứng dụng Spring của tôi, tôi muốn chèn rất nhiều dữ liệu vào một phương pháp thiết lập và sau đó sử dụng nó để kiểm tra. Tuy nhiên, bất cứ điều gì được thực hiện trong phương pháp @Before dường như được cuộn lại sau mỗi lần kiểm tra, ngay cả khi tôi chú thích phương pháp này với @Rollback(false)@Rollback (false) không hoạt động trên @Trước khi sử dụng SpringJUnit4ClassRunner

Dưới đây là một phiên bản đơn giản của những gì tôi đang cố gắng để làm:

public class TestClass 
{ 
    @Autowired 
    MyService service; 

    @Before 
    public void setup() 
    { 
     if(service.getById(1) == null) 
     { 
     Thing thing = new Thing(); 
     thing.setId(1); 
     service.create(new Thing(1)) 
     } 
    } 
} 

Tôi cũng đã thử sử dụng @BeforeClass, nhưng yêu cầu phương thức tĩnh và thực thi trước khi bất kỳ phương thức seter @Autowired nào được gọi, vì vậy tôi không thể truy cập vào các dịch vụ tôi cần gọi khi chạy @BeforeClass.

Tôi đã thử sử dụng @PostConstruct, nhưng có vấn đề với việc có giao dịch có sẵn (và thiết lập của tôi sao cho phiên Hibernate chỉ khả dụng khi giao dịch bắt đầu). Kỳ lạ một phiên dường như có sẵn, nhưng hai đối tượng nhận được từ bên trong cùng một phiên không bằng nhau, có nghĩa là bộ nhớ đệm cấp 1 Hibernate dường như không hoạt động hoặc mỗi hoạt động diễn ra trong một phiên riêng biệt. @BeforeTransaction dường như thể hiện cùng một hành vi.

+0

Bạn đặt chú thích '@ Rollback' ở cấp lớp hoặc phương thức ở đâu? – Ralph

+0

@Ralph Tôi đã thử cả hai phương thức 'setup()' '@Rollback (false)', và sau đó cũng trên lớp trong khi cũng chú thích các phương thức thử nghiệm với '@ Rollback'. –

+0

Bạn đã bao giờ tìm cách để đạt được điều này? – Arjan

Trả lời

2

Spring TransactionalTestExecutionListener chịu trách nhiệm quản lý giao dịch cho Kiểm tra Junit. Nó sử dụng hai phương thức (trướcTestMethodafterTestMethod) để bắt đầu và kết thúc giao dịch cho mỗi Bài kiểm tra Junit.

Đối với @Before chú thích có vẻ như để làm việc như thế này, Nó áp dụng @Rollback thuộc tính xác định trên phương pháp thử nghiệm với phương pháp setUp với @Before chú thích

Tôi có ví dụ này để giải thích quá trình , Tôi có hai phương pháp thử nghiệm một với (cuộn ngược lại với phương thức quay ngược lại)

 @RunWith(SpringJUnit4ClassRunner.class) 
     @ContextConfiguration(loader=AnnotationConfigContextLoader.class, classes={SpringConfig.class}) 
     @Transactional 
     public class MyTest 
     { 

     @Before 
     public void setUp() 
     { 
      //When executing this method setUp 
      //The transaction will be rolled back after rollBackTrue Test 
      //The transaction will not be rolled back after rollBackFalse Test 
     } 


     @Test 
     @Rollback(true) 
     public void rollBackTrue() 
     { 
      Assert.assertTrue(true); 
     } 

     @Test 
     @Rollback(false) 
     public void rollBackFalse() 
     { 
      Assert.assertTrue(true); 
     } 
    } 
+0

Xin chào Prasana. Cảm ơn câu trả lời của bạn, nhưng điều đó không đúng. Nếu service.create() không phải là một phần của một giao dịch, thì tại sao nó lại được khôi phục sau mỗi lần kiểm tra? Vấn đề là * muốn * nó nằm ngoài một giao dịch để nó không bị cuộn lại, nhưng không thể tìm ra cách. –

+0

Xin lỗi, Bài kiểm tra của tôi đã loại bỏ tôi và tôi cũng nên đọc tài liệu phương pháp, tôi đã thay đổi câu trả lời bằng một ví dụ. –