2015-04-17 13 views
5

Tôi có một ứng dụng Khởi động mùa xuân với Spring Data Rest và tôi sử dụng @WebIntegrationTest cùng với TestRestTemplate trong các bài kiểm tra tích hợp của tôi. Các lớp cơ sở cho các cuộc thử nghiệm trông giống như sau:Khởi động mùa xuân @WebIntegrationTest và TestRestTemplate - Có thể quay lại các giao dịch thử nghiệm không?

@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles(profiles = "test") 
@SpringApplicationConfiguration(classes = Application.class) 
@Transactional 
@TransactionConfiguration 
@WebIntegrationTest("server.port: 0") 
public abstract class IntegrationTest { 

    ... 

} 

Tôi đã thử nghiệm việc tạo ra một thực thể bằng cách sử dụng các TestRestTemplate để thực hiện một yêu cầu POST tới một tài nguyên. Vấn đề là giao dịch mà vẫn tồn tại thực thể trên cơ sở dữ liệu không được khôi phục ngay cả khi các thử nghiệm của tôi được cấu hình để được giao dịch, vì vậy thực thể vẫn còn trên cơ sở dữ liệu sau khi thử nghiệm. Tôi hiểu rằng bởi vì các giao dịch được cuộn lại trong thử nghiệm không phải là cùng một sự kiên trì của thực thể.

Bây giờ câu hỏi của tôi là, có cách nào để quay lại các giao dịch được kích hoạt bởi các yêu cầu được thực hiện thông qua phương thức thử nghiệm RestTemplate không?

+1

tôi sẽ nói không, cách duy nhất sẽ tự xóa các mục thêm ... –

+0

FYI: bạn có thể xóa một cách an toàn khai báo '@ TransactionConfiguration': nó không có hiệu lực ở đây. –

Trả lời

16

có cách nào để quay lại các giao dịch được kích hoạt bởi các yêu cầu được thực hiện thông qua phương thức thử nghiệm RestTemplate không?

Không. Không thể quay lại các giao dịch do ứng dụng được triển khai của bạn quản lý.

Khi bạn chú thích lớp thử nghiệm của mình với @WebIntegrationTest@SpringApplicationConfiguration, Spring Boot sẽ khởi chạy vùng chứa Servlet được nhúng và triển khai ứng dụng của bạn trong đó. Vì vậy, theo nghĩa đó, thử nghiệm và ứng dụng của bạn đang chạy trong hai quy trình khác nhau.

Spring TestContext Framework chỉ quản lý Test-managed transactions. Do đó, sự hiện diện của @Transactional đối với lớp thử nghiệm của bạn chỉ ảnh hưởng đến các giao dịch được kiểm soát cục bộ, chứ không ảnh hưởng đến các quy trình khác.

Khi người khác đã đề cập, một công việc xung quanh sẽ là đặt lại trạng thái của cơ sở dữ liệu sau khi thử nghiệm của bạn đã hoàn thành. Đối với điều này, bạn có một số tùy chọn. Tham khảo phần Executing SQL scripts của tài liệu tham khảo để biết chi tiết.

Kính trọng,

Sam (tác giả của mùa xuân TestContext Khung)

+0

Cảm ơn sự giúp đỡ Sam. Tôi cho rằng đó là câu trả lời. Tôi đã đặt lại trạng thái cơ sở dữ liệu. Chúc mừng. –

+0

Một câu hỏi cuối cùng. Nếu thử nghiệm và ứng dụng đang chạy trong hai quy trình khác nhau thì làm thế nào để có thể tiêm các thành phần của nó vào lớp thử nghiệm? –

+0

Khi tôi nói _different process_, đó có lẽ là một chút sai lầm. Vùng chứa được nhúng và chạy thử nghiệm của bạn trong cùng một quy trình JVM; tuy nhiên, thùng chứa Servlet được nhúng tự động thực hiện các yêu cầu trong các luồng khác nhau từ nhóm luồng riêng của nó. Vì hỗ trợ giao dịch của Spring dựa trên 'ThreadLocal', khái niệm về các luồng khác nhau là điều quan trọng liên quan đến các ranh giới giao dịch. Tuy nhiên, 'ApplicationContext' được khởi chạy trong luồng của bài kiểm tra. Vì vậy, các thành phần từ ngữ cảnh có thể được đưa vào thử nghiệm của bạn, ngay cả khi các thành phần đó được thực hiện trong các chủ đề của thùng chứa. –

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