2012-03-01 21 views
6

Tôi có một ứng dụng web truy cập dịch vụ web bên ngoài. Tôi đang viết một bộ thử nghiệm chấp nhận tự động cho ứng dụng web. Tôi không muốn gọi dịch vụ web bên ngoài vì nó có phí tổn nghiêm trọng, tôi muốn thử dịch vụ web này. Làm thế nào để đạt được điều này mà không làm thay đổi bối cảnh ứng dụng của ứng dụng web? Gần đây chúng tôi đã di chuyển sang Spring 3.1 nên tôi bị cám dỗ sử dụng các tính năng môi trường mới. Những tính năng mới này có giúp tôi ghi đè dịch vụ web đơn này và để lại ngữ cảnh ứng dụng không?cách ghi đè bean đơn được xác định trong ngữ cảnh ứng dụng

Trả lời

4

Tôi sẽ sử dụng một số BeanFactoryPostProcessor để thực hiện việc này, chỉ được đăng ký trong các trường hợp thử nghiệm mà bạn muốn mô phỏng này.

BeanFactoryPostProcessor cho phép bạn sửa đổi ngữ cảnh ứng dụng ngay sau khi được tạo và điền. Bạn có thể tìm kiếm tên của bean cụ thể của bạn và đăng ký một bean khác cho nó.

public class SystemTestBeanFactoryPostProcessor implements BeanFactoryPostProcessor 
{ 
    @Override 
    public void postProcessBeanFactory(final ConfigurableListableBeanFactory factory) throws BeansException 
    { 
     final MyInterface myInterface = new MyInterfaceStub(); 
     factory.registerSingleton("myInterfaceBeanName", myInterface); 
    } 
} 

Điều này sẽ cho phép bạn ghi đè chỉ những hạt bạn muốn nhập/thử.

Tôi không chắc rằng đây là cách 'mới nhất 3.x' để thực hiện việc này. Nhưng nó rất đơn giản và dễ thực hiện.

9

Tôi sẽ sử dụng tính năng Spring @Profile, mà tôi giả định là "các tính năng môi trường" mà bạn đang đề cập đến.

Ví dụ:

@Service @Profile("dev") 
public class FakeWebService implements WebService { 
} 

@Service @Profile("production") 
public class ExternalWebService implements WebService { 
} 

EDIT

Và để xác định các hồ sơ cá nhân để sử dụng trong thử nghiệm của bạn:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/app-config.xml") 
@ActiveProfiles("dev") 
public class MyAcceptanceTest { 
} 

Xem this section của các tài liệu Xuân để biết thêm chi tiết.

Có một số cách để thiết lập hồ sơ cá nhân hoạt động trong sản xuất, nhưng phương pháp tôi đã sử dụng trước đó là trong web.xml:

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>spring.profiles.active</param-name> 
     <param-value>production</param-value> 
    </init-param> 
</servlet> 
+0

Nơi nào bạn chỉ định 'Profile' bạn đang sử dụng trong của bạn cấu hình thử nghiệm (hoặc cấu hình sản xuất của bạn)? –

+0

Tôi đã cập nhật câu trả lời của mình với một số ví dụ, bạn cũng có thể sử dụng cài đặt cấu hình trong tệp beans.xml của mình nếu cần. – seanhodges

+0

+1 Cảm ơn! Ví dụ rất hay. –

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