2011-10-11 21 views
5

Situación: Tengo una clase de implementación de servicio anotada con @Service con acceso al archivo de propiedades.Cómo acceder al objeto Spring @Service desde la prueba jUnit

@Service("myService") 
public class MySystemServiceImpl implements SystemService{ 

     @Resource 
     private Properties appProperties; 

} 

Las propiedades del objeto se configuran a través de config-file. applicationContext.xml

<util:properties id="appProperties" location="classpath:application.properties"/> 

Quiero probar algunos métodos de esta aplicación.

Pregunta: ¿Cómo acceder a MySystemServiceImpl-object desde la clase de prueba de manera que Properties appProperties se inicialice correctamente?

public class MySystemServiceImplTest { 

    //HOW TO INITIALIZE PROPERLY THROUGH SPRING? 
    MySystemServiceImpl testSubject; 

    @Test 
    public void methodToTest(){ 
     Assert.assertNotNull(testSubject.methodToTest()); 
    }  

} 

no puedo sencillo crear nuevos MySystemServiceImpl - que los métodos que utilizan appProperties lanza NullPointerException. Y no puedo inyectar propiedades directamente en el objeto; no hay un método setter apropiado.

sólo hay que poner medidas correctas aquí (gracias a @NimChimpsky de respuesta):

  1. copié application.properties bajo prueba/dir recursos.

  2. He copiado applicationContext.xml en test/resources dir. En el contexto de aplicación agrego nuevo bean (definición de propiedades de la aplicación ya está aquí):

    <bean id="testSubject" class="com.package.MySystemServiceImpl"> 
    
  3. modifiqué clase de prueba de tal manera:

    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(locations={"/applicationContext.xml"}) 
    public class MySystemServiceImplTest { 
    
        @Autowired 
        MySystemServiceImpl testSubject; 
    
    } 
    
  4. Y esto hace el truco - ahora en mi clase de prueba totalmente funcional objeto está disponible

Respuesta

7

Como alternativa, para hacer una prueba de integración lo hago.

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations={"/applicationContext-test.xml"}) 
@Transactional 
public class MyTest { 

    @Resource(name="myService") 
    public IMyService myService; 

Luego use el servicio como lo haría normalmente. Agregue el contexto de la aplicación a su directorio de prueba/recursos

+0

Gracias, ayuda mucho. – dim1902

1

Sólo tiene que utilizar su constructor:

MySystemServiceImpl testSubject = new MySystemServiceImpl(); 

Esta es una prueba unitaria. Una prueba unitaria prueba una clase aisladamente de las otras clases y de la infraestructura.

Si su clase tiene dependencias sobre otras interfaces, simule esas interfaces y cree el objeto con estos simulacros como argumento. Ese es el objetivo de la inyección de dependencias: poder inyectar otras implementaciones simuladas dentro de un objeto para probar este objeto fácilmente.

EDIT:

Debe proporcionar un setter para sus propiedades de objeto, con el fin de poder inyectar las propiedades que desee para cada una de las pruebas unitarias. Las propiedades inyectadas pueden contener valores nominales, valores extremos o valores incorrectos según lo que desee probar. La inyección de campo es práctica, pero no encaja bien con las pruebas unitarias. Se debe preferir la inyección de constructor o instalador cuando se utilizan pruebas unitarias, porque el objetivo principal de la inyección de dependencia es precisamente poder inyectar dependencias simuladas o específicas en pruebas unitarias.

+0

Lamentablemente no tengo la capacidad de modificar la clase. Es por eso que tengo que seguir con la inyección de Spring. En todo lo demás estoy de acuerdo con su punto de vista – dim1902

Cuestiones relacionadas