2012-05-04 20 views
8

Tôi đang cố gắng viết các bài kiểm tra tích hợp cho một bộ điều khiển trong ứng dụng mvc mùa xuân của chúng tôi. Bộ điều khiển gọi một lớp dịch vụ mà lần lượt gọi một dao để đọc/ghi dữ liệu từ kho lưu trữ. DAO cần tra cứu một số cấu hình. Bean cấu hình được định nghĩa trong WEB-INF/applicationContext.xml.Viết các bài kiểm tra Junit cho ứng dụng Spring MVC mà nội bộ dựa vào ContextLoader.getCurrentWebApplicationContext()

Tôi đang sử dụng một cái gì đó như thế này:.

cấu hình config = (Configuration) ContextLoader.getCurrentWebApplicationContext() getBean ("config");
riêng String namespace = config.getProperty ("someproperty");

Các thuộc tính được lưu trữ trong zookeeper vì vậy tôi không sử dụng hiện vật quản lý tài sản của mùa xuân.

Vấn đề là khi chạy thử nghiệm JUnit ContextLoader.getCurrentWebApplicationContext() luôn trả về giá trị rỗng.

Tôi đã cho đến nay nhìn những phương pháp sau đây:
1. Cách tiếp cận Ted Young (chỉ cần tìm kiếm google cho xét nghiệm mùa xuân hội nhập MVC ted trẻ)
2. https://github.com/SpringSource/spring-test-mvc
3. trang web này .. câu hỏi/8.464.919/đơn vị thử nghiệm-một-servlet-that-phụ thuộc-on-suối-webapplicationcontextutils-getre
4. Sử dụng Selenium/JWebunit
5. http://confluence.highsource.org/display/Hifaces20/Hifaces20+Testing+package+-+testing%2C+tracing+and+debugging+web+applications+with+Jetty

1 không giải quyết được vấn đề này. WebApplicationContext vẫn null
2 tiểu bang hỗ trợ cho WebApplicationContext sẽ có sẵn vào mùa xuân 3.2
3. Tôi không hiểu điều này. Tôi lấy testApplicationContext và getServletContext() từ đâu?
4. Tôi không muốn đi theo cách này vì đây là thử nghiệm blackbox hoàn toàn.
5. Tôi hiện đang xem xét 5. Nhưng điều này đòi hỏi phải khởi động một thùng chứa servlet. Có cách nào khác không?

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào bạn có thể cung cấp.

Cảm ơn PixalSoft

@Ted trẻ SO đã không cho phép tôi để hoàn thành những gì tôi đã saying.With loader = MockWebApplicationContextLoader, nó không được coi là có sẵn như là contextloader mặc định chính xác như ContextLoader Xuân cư xử khi webapp được khởi tạo bởi một servletcontainer? Có một cái gì đó đặc biệt mà tôi cần làm để có được một xử lý trên MockWebApplicationContextLoader không? Việc tiêm đối tượng config làm việc cho các đối tượng singleton. Nhưng tất cả không thể là singleton. Việc truyền một đối tượng config vào mọi constructor có vẻ quá tẻ nhạt. Bây giờ, tôi đã tạo ra một lớp có một đối tượng cấu hình tĩnh, được autowired thông qua một phương thức setter. Tôi sẽ xem xét ApplicationContextAware.Many thx

Trả lời

0

lưu trữ tệp thuộc tính của bạn trong đường dẫn lớp của bạn.

nay truy cập vào tài sản đó trong lớp điều khiển của bạn như thế này:

/*to access your filename.properties file */ 
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties")); 

String sServerLocation = properties.getProperty("key"); 

bây giờ bạn có thể truy cập tập tin bất động sản của bạn.

Tôi chắc chắn nó sẽ hoạt động.

+0

Xin chào, Cảm ơn bạn đã trả lời. Chúng ta không thể lưu trữ các thuộc tính trong một tệp thuộc tính vì chúng ta đang ở trong một môi trường phân tán và chúng ta cần lưu trữ các thuộc tính trong zookeeper vì lý do đó. Ngoài ra, tôi không nghĩ rằng việc sử dụng ContextLoader.getCurrentWebApplicationContext() nên ngăn chặn một ứng dụng được kiểm tra đơn vị. – user1373927

1

Lý do tại sao ContextLoader.getCurrentWebApplicationContext trả về null là vì, khi bạn sử dụng MockWebApplicationContextLoader của mình, bạn không sử dụng ngữ cảnh ứng dụng web cũng như việc triển khai ContextLoader cụ thể.

Vì kho lưu trữ của bạn do Spring quản lý, tại sao bạn không chỉ cần tiêm đối tượng cấu hình vào kho lưu trữ? Việc tiêm đối tượng config là cách thích hợp nhất để truy cập nó. Sau đó, bạn có thể khởi tạo thuộc tính không gian tên của mình trong một phương thức được chú thích bằng @PostConstruct.

Ngoài ra, DOA của bạn có thể triển khai ApplicationContextAware để nhận bản sao ngữ cảnh ứng dụng trong khi xây dựng.

+0

Xin chào, Nếu tôi sử dụng loader = MockWebApplicationContextLoader, không phải là nó có sẵn như trình tải ngữ cảnh mặc định chính xác như Trình tải ngữ cảnh mùa xuân hoạt động khi ứng dụng web được khởi tạo bởi một thùng chứa servlet không? Có điều gì đặc biệt mà tôi cần thực hiện để xử lý trên MockWebApplicationContextLoader không? OTOH, nếu nó không hoạt động theo cách này, tại sao tôi cần nó? – user1373927

+2

Không, nó không phải là ** nghĩa vụ ** để có sẵn. Bạn sẽ phải mở rộng MWACL để cấu hình ContextLoader, và tôi không thấy bất kỳ cách nào dễ dàng để làm điều đó. Việc sử dụng ContextLoader là một ý tưởng tồi cho loại lý do này. Bạn thực sự nên tự hỏi tại sao bạn đang sử dụng ContextLoader để truy cập vào ApplicationContext ngay từ đầu. –

+0

Chúng tôi đang sử dụng ContextLoader bởi vì nó chỉ đơn giản là không thể tiêm đậu mùa xuân ở khắp mọi nơi họ cần thiết. AFAIK ContextLoader.getCWAC() là cách sử dụng API hợp lệ. Cám ơn. – user1373927

3

Thêm đoạn mã sau vào đầu thử nghiệm junit của bạn:

MockServletContext sc = new MockServletContext(""); 
sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, 
     "/applicationContext-test.xml"); // <== Customize with your paths 
ServletContextListener listener = new ContextLoaderListener(); 
ServletContextEvent event = new ServletContextEvent(sc); 
listener.contextInitialized(event); 

Nếu bạn cần thêm nhiều hơn một xml cho đường dẫn bối cảnh chỉ cần đặt chúng trong cùng một chuỗi tách biệt với không gian, như thế này:

sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, 
     "/applicationContext-test.xml /applicationContext-other.xml"); 
+0

giải pháp rất tốt, chỉ cần thêm tài liệu để biết thêm thông tin chi tiết https://docs.spring.io/spring/docs/2.5.x/javadoc-api/org/springframework/mock/web/MockServletContext.html – VedX

3

Bạn phải thêm ngữ cảnh WebApplication vào ContextLoderListner theo cách thủ công. Điều này sẽ hoạt động.

@ContextConfiguration(locations = "classpath:module-test-beans.xml") 
@WebAppConfiguration 
public class SampleTest extends AbstractTestNGSpringContextTests { 

    @Autowired 
    private WebApplicationContext wac; 

    @BeforeClass 
    public void setUp() throws ServletException { 
     MockServletContext sc = new MockServletContext(""); 
     ServletContextListener listener = new ContextLoaderListener(wac); 
     ServletContextEvent event = new ServletContextEvent(sc); 
     listener.contextInitialized(event); 
    } 

    @Test 
    public void testMe() { 
     Assert.assertFalse(ContextLoader.getCurrentWebApplicationContext() == null); 
    } 
} 
Các vấn đề liên quan