2012-09-23 42 views
5

Tôi có số lượng lớn các trường hợp thử nghiệm chạy với Hỗ trợ Spring Junit với các chú thích sau trên mỗi Bài kiểm tra.Cách tạo và sử dụng chú thích tùy chỉnh có chú thích cấu hình Spring + JUnit Test Config?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:spring/applicationContext.xml") 
@TransactionConfiguration(transactionManager="transactionManager") 
@Transactional 
@ActiveProfiles("test") 

Thay vì đặt tất cả chú thích này vào mỗi lớp Kiểm tra tôi muốn tạo chú thích tùy chỉnh và sử dụng chú thích.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:spring/applicationContext.xml") 
@TransactionConfiguration(transactionManager="transactionManager") 
@Transactional 
@ActiveProfiles("test") 

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE }) 
@Retention(RetentionPolicy.RUNTIME) 
@Inherited 
public @interface SpringJUnit4TestConfig { 

} 

Nhưng khi tôi sử dụng tùy chọn này, chú thích Spring Injection không xảy ra.

@SpringJUnit4TestConfig 
public class UserServiceTest 
{ 
} 

Tôi thiếu gì ở đây?

PS: Nhưng JUnit's @RunWith và Spring's @Transactional, @ContextConfiguration đều có @ Inherited..So tôi nghĩ nó sẽ hoạt động. Nhưng bây giờ tôi vượt qua nó thông qua một công việc xung quanh. Tạo một lớp Tóm tắt dựa trên và đặt tất cả các chú thích trên đó và các trường hợp thử nghiệm mở rộng lớp cơ sở đó.

+0

Tôi chỉ nên sử dụng @Target ({ElementType.TYPE}) Tôi không nghĩ rằng bạn sẽ sử dụng điều này trong một trường hoặc thông số hoặc bạn? – Koitoer

+0

Bạn nói đúng. Chú thích tùy chỉnh này chỉ nên được áp dụng trên ElementType.TYPE. –

+0

Tôi cũng muốn làm chính xác như vậy. Đọc câu hỏi và câu trả lời Tôi đã tạo chú thích sử dụng tất cả các cấu hình ngoại trừ '@ RunWith' và có vẻ hoạt động tốt cho đến nay. Tôi sử dụng '@RunWith (SpringJUnit4ClassRunner.class)' trên mỗi lớp TestCase. – ykesh

Trả lời

2

Tôi không nghĩ rằng cách tiếp cận này sẽ hoạt động, vì @RunWith là chú thích JUnit, do đó, để làm việc này, chú thích JUnit phải chuyển tiếp.

Khi một lớp được chú thích bằng @RunWith hoặc mở rộng một lớp được chú thích bằng @RunWith, JUnit sẽ gọi lớp mà nó tham chiếu để chạy thử nghiệm trong lớp đó thay vì người chạy được xây dựng thành JUnit. Chúng tôi đã thêm tính năng này vào cuối phát triển. Mặc dù có vẻ mạnh mẽ nhưng chúng tôi hy vọng API runner sẽ thay đổi khi chúng tôi tìm hiểu cách mọi người thực sự sử dụng nó. Một số lớp học hiện tại sẽ có thể được tinh chỉnh và trở thành công khai.

Vì vậy, kiểm tra việc gọi thử JUnit dường như chỉ hoạt động đối với các lớp được kế thừa.

Đối với Spring, nó hỗ trợ một điều được gọi là context configuration inheritance cho vị trí cấu hình, Tôi không chắc chắn điều này có hiệu quả đối với các loại chú thích khác hay không (vui lòng chỉ cho tôi tài liệu, nếu bạn nghĩ khác) Thực ra, điều này sẽ có khả năng làm việc cho các chú thích khác trong trường hợp thừa kế lớp cấu hình thử nghiệm vì chính chú thích @Transactional được khai báo với @Inherited cho trường hợp này.

Vì vậy, trong trường hợp này, nó không chạy vì thiếu chú thích của JUnit.

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