2012-03-01 13 views
6

Tengo una aplicación web que accede a un servicio web externo. Estoy escribiendo un paquete de prueba de aceptación automática para la aplicación web. No quiero invocar el servicio web externo ya que tiene una sobrecarga importante, quiero burlarme de este servicio web. ¿Cómo puede lograr esto sin cambiar el contexto de la aplicación web? Recientemente migramos a Spring 3.1, por lo que estoy tentado de utilizar las nuevas características del entorno. ¿Esta nueva característica me ayudaría a anular este único servicio web y dejar el contexto de la aplicación como está?cómo anular el bean único definido en el contexto de la aplicación

Respuesta

4

Utilizaría un BeanFactoryPostProcessor para hacer esto, que solo está registrado en los escenarios de prueba que desea que se burlen.

El BeanFactoryPostProcessor le permite modificar el Contexto de la aplicación inmediatamente después de que se haya creado y completado. Puede buscar el nombre de su bean específico y registrar un bean diferente para él.

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

Esto le permitirá sobreescribir solo los granos que quiera cortar/simular.

No estoy seguro de que esta sea la "nueva forma 3.x 'de hacer este tipo de cosas. Pero es muy sencillo y fácil de implementar.

9

Utilizaría la función Spring @Profile, que supongo que son las "características del entorno" a las que se estaba refiriendo.

Por ejemplo:

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

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

EDITAR

Y para especificar qué perfil utilizar en su prueba:

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

Ver this section de los documentos de la primavera para más detalles.

Hay varias formas de configurar el perfil activo en la producción, pero el método que he usado antes es en el 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

¿Dónde se especifica qué 'Profile' que está utilizando en su configuración de prueba (o su configuración de producción)? –

+0

He actualizado mi respuesta con algunos ejemplos, también puede usar la configuración de perfil en beans.xml si es necesario. – seanhodges

+0

+1 ¡Gracias! Muy buen ejemplo. –

Cuestiones relacionadas