2012-07-03 40 views
52

Tôi muốn viết một số thử nghiệm kiểm tra cấu hình XML Spring của một WAR đã triển khai. Thật không may, một số bean yêu cầu một số biến môi trường hoặc thuộc tính hệ thống được thiết lập. Làm thế nào tôi có thể thiết lập một biến môi trường trước khi các bean mùa xuân được khởi tạo khi sử dụng kiểu kiểm tra thuận tiện với @ContextConfiguration?Làm thế nào để đặt biến môi trường hoặc thuộc tính hệ thống trong các thử nghiệm mùa xuân?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
public class TestWarSpringContext { ... } 

Nếu tôi định cấu hình ngữ cảnh ứng dụng bằng chú thích, tôi không thấy móc mà tôi có thể làm gì đó trước khi bối cảnh mùa xuân được khởi tạo.

Trả lời

75

Bạn có thể khởi tạo thuộc tính hệ thống trong một initializer tĩnh:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
public class TestWarSpringContext { 

    static { 
     System.setProperty("myproperty", "foo"); 
    } 

} 

Mã initializer tĩnh sẽ được thực hiện trước bối cảnh ứng dụng lò xo được khởi tạo.

+8

Ngớ ngẩn tôi - OK, điều đó sẽ hiệu quả. Thậm chí tốt hơn: có thể là phương thức '@ BeforeClass' để đặt thuộc tính hệ thống và phương thức' @ AfterClass' để xóa nó cũng sẽ hoạt động và tự động dọn dẹp sau chính nó. (Tuy nhiên, không thử nó.) –

+1

Đã thử @BeforeClass - và nó hoạt động tốt để thiết lập thuộc tính hệ thống trước khi các thuộc tính khác được đặt trong cá thể kiểm tra – wbdarby

+0

Cảm ơn vì điều này. Điều tĩnh đã không làm việc nhưng một phương pháp nhỏ với @BeforeClass đã làm việc! –

45

Cách đúng để thực hiện việc này, bắt đầu từ Mùa xuân 4.1, là sử dụng chú thích @TestPropertySource.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "classpath:whereever/context.xml") 
@TestPropertySource(properties = {"myproperty = foo"}) 
public class TestWarSpringContext { 
    ...  
} 

Xem @TestPropertySource trong Spring docsJavadocs.

+1

Chú thích này cũng hỗ trợ đường dẫn tệp thuộc tính. – MigDus

+2

Tôi có thể chuyển nhãn Khách hàng Cấu hình Đám mây Mùa xuân trong các thử nghiệm bằng cách sử dụng '@TestPropertySource (thuộc tính = {" spring.cloud.config.label = feature/branch "})' –

+0

Câu trả lời hay, nhưng đáng tiếc là không hiệu quả đối với tôi, bằng cách sử dụng Mùa xuân 4.2.9, tài sản luôn trống rỗng. Chỉ có khối tĩnh làm việc ... Làm việc cho các thuộc tính ứng dụng, nhưng không phải cho các thuộc tính hệ thống. – Gregor

4

Người ta cũng có thể sử dụng một ApplicationContextInitializer thử nghiệm để khởi tạo một hệ thống tài sản:

public class TestApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> 
{ 
    @Override 
    public void initialize(ConfigurableApplicationContext applicationContext) 
    { 
     System.setProperty("myproperty", "value"); 
    } 
} 

và sau đó cấu hình nó trên lớp thử nghiệm, thêm vào các tập tin địa điểm mùa xuân bối cảnh cấu hình:

@ContextConfiguration(initializers = TestApplicationContextInitializer.class, locations = "classpath:whereever/context.xml", ...) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SomeTest 
{ 
... 
} 

này cách sao chép mã có thể tránh được nếu một thuộc tính hệ thống nhất định phải được đặt cho tất cả các thử nghiệm đơn vị.

0

Nếu bạn muốn biến của bạn có giá trị cho tất cả các bài kiểm tra, bạn có thể có một tập tin application.properties trong thư mục nguồn thử nghiệm của bạn (theo mặc định: src/test/resources) sẽ giống như thế này:

MYPROPERTY=foo 

này sau đó sẽ được tải và sử dụng trừ khi bạn có định nghĩa thông qua @TestPropertySource hoặc phương pháp tương tự - thứ tự chính xác trong đó các thuộc tính được tải có thể được tìm thấy trong chương tài liệu Spring 24. Externalized Configuration.

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