2012-10-09 19 views
10

Tôi đang viết một bài kiểm tra tích hợp trong đó một bối cảnh ứng dụng xml được khởi tạo trong khi khởi động. Có một số phương pháp thử nghiệm trong lớp thử nghiệm sử dụng một bean cụ thể 'X' (đã được định nghĩa trong xml). Yêu cầu thực tế của tôi là chế biến đậu X chỉ cho một trong các phương pháp thử nghiệm.Thay thế đậu mùa xuân trong một ngữ cảnh bằng phiên bản giả từ một ngữ cảnh khác

Bên trong phương pháp thử: Tôi đã thử tạo ngữ cảnh ứng dụng riêng biệt bằng cách sử dụng ClassPathXMLApplicationContext chỉ với bean giả 'M'.

Bây giờ tôi có hai bối cảnh ứng dụng (AC): 1. Một trường hợp được tạo trong quá trình khởi động thử nghiệm (có chứa bean X thực tế) và 2. Một được tạo bằng cách sử dụng ClassPathXMLApplicationContext trong phương pháp thử nghiệm (trong đó có mock bean M).

Tôi muốn thay thế định nghĩa bean thực tế 'X' trong AC: 1, sử dụng định nghĩa bean giả 'M' từ AC: 2.

Ai đó có thể vứt nhẹ đèn này lên không?

Trả lời

16

Không có cách nào rõ ràng để thay thế một hạt trong một làm mới ApplicationContext trừ khi bạn đóng và làm mới lại.

Để mô phỏng nó, cách tiếp cận chung là sử dụng Proxy của bean mà bạn muốn thay thế và thay đổi mục tiêu khi chạy.

Bạn có thể làm điều đó một cách dễ dàng bằng cách sử dụng các lớp học hỗ trợ khung aop:

<bean id="realBean" class="RealClass" /> 
<bean id="mockBean" class="MockClass" /> 
<bean id="targetSource" class="org.springframework.aop.target.HotSwappableTargetSource"> 
    <constructor-arg ref="realBean>" /> 
</bean> 

<bean id="bean" class="org.springframework.aop.framework.ProxyFactoryBean> 
    <property name="targetSource" ref="targetSource" /> 
</bean> 

 

@Test 
public void testWithMockBean() { 
Object real = targetSource.swap(mock); 
.... 
// do your test work 
... 
targetSource.swap(real); 

} 
23

Bạn có thể:

  • sử dụng Profile chú thích nếu bạn có mùa xuân 3.1.
  • sử dụng Primary chú thích
  • sử dụng qualifiers
  • dây đậu mình trong bối cảnh mùa xuân

và tôi chắc chắn rằng thậm chí có những thêm nhiều lựa chọn.

+0

tiểu học là chính xác những gì tôi đang tìm kiếm. Cảm ơn vì điều đó! – daniel

+2

** @ Primary ** là câu trả lời hay nhất: "Chỉ ra rằng một bean nên được ưu tiên khi nhiều ứng cử viên đủ điều kiện để tự động (...)" – jsosnowski

+0

Đối với tôi \ @Primary cũng là Câu trả lời hay nhất, nhưng điều gì xảy ra khi khi \ @Qualifier được sử dụng? – deFreitas

3

Tạo một testApplicationContext với

<beans> 
    <import resource="classpath*:appContext.xml" /> 
    <bean id="mockbeanOfX" class=....../> 
</beans> 

và sau đó tải này bối cảnh ứng dụng thử nghiệm trong testcase của bạn. Bây giờ bạn có thể lấy đậu giả từ ngữ cảnh ứng dụng và chuyển nó vào bất cứ nơi nào cần thiết.