2011-07-21 12 views
6

Como principiante en el desarrollo de Test Driven acabo de encontrar un problema. Mi clase de prueba comienza de la siguiente manera:Pruebas de JUnit independientes con Springs @Autowired

@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional 
@DirtiesContext 
@ContextConfiguration(locations = {"/web-test.xml"}) 
public class XXTest { 

    @Autowired 
    XX xx; 

    @Autowired 
    HibernateTemplate template; 

    @Test 
    public void testSetGetXXValue() throws Exception { 
    final Map<String, YY> profilMap = new HashMap<String, YY>(2); 
    profilMap.put("1", new YY()); 
    profilMap.put("2", new YY()); 

    simpleCockpit.setValues(profilMap); 

    assertEquals(profilMap, simpleCockpit.getValues()); 
    } 

Como se puede ver, el primer método de prueba altera la clase XX autowired. Eso afecta a todos los siguientes métodos de prueba, que se basa en que XX tiene los valores de autoconexión.

¿Cómo puedo probar getter y setter desde XX Y asegúrese de que XX tenga los valores de autowired para el resto de los métodos de prueba?

Pensamientos:

  • Pon los valores de la derecha al final del método de ensayo. Malo porque si el getter/setter no funciona, tampoco funcionará.
  • Coloque el primer método de prueba al final de la clase de prueba. Malo porque eso hace que las pruebas dependan de su orden de ejecución.
  • No pruebe el captador/instalador de XX. Malo porque getter/setter tiene que ser probado como todos los métodos.

Gracias por sus respuestas! Yo estoy bastante seguro de que esto tiene una solución fácil ... :)

EDITAR: En cuanto a las cuestiones de si getters/setters o no de pruebas unitarias, me decidieron a hacerlo, principalmente debido a las razones Statet en http://www.sundog.net/sunblog/posts/should-we-test-getters-and-setters/.

Respuesta

7

Si modifica un bean administrado por resorte, puede usar la Anotación @DirtiesContext. ¡Esta anotación se puede poner en clases de prueba, así como en métodos de prueba!

De @DirtiesContext Java Doc:

anotación de prueba que indica que el enlace @ {} org.springframework.context.ApplicationContext Application Context asociada a una prueba es sucia y debe ser cerrado:

  • después de la prueba actual, cuando se declara en el nivel de método
  • después de cada método de prueba en la c urrent clase de prueba, cuando se declaran en el nivel de clase con el modo de establecer la clase de {@ link ClassMode # AFTER_EACH_TEST_METHOD AFTER_EACH_TEST_METHOD}
  • después de la clase de prueba actual, cuando se declaró a nivel de clase con el modo de establecer la clase de {ClassMode @link #AFTER_CLASS AFTER_CLASS}

E incluso en Test Driven Development (a mi entender): escribir pruebas explicite solamente para la materia que tiene una complejidad mínima. Así que nunca escribo pruebas explicite para getter y setter. Normalmente tengo una prueba que comprueba alguna funcionalidad, y cuando esta funcionalidad necesita getter y setter, escribo este getter y setter (en este punto en el tiempo) y que funciona será verificado por la funcionalidad que comencé con implícito.


Especialmente en su caso: ¿por qué se utiliza la primavera Bean, ¿por qué no usar objetos "normales" creados con new. Utilizo las clases "normales" siempre que sea útil para las pruebas, principalmente para pruebas simples. Yo uso Spring Beans para pruebas "más grandes" también.

+0

@DirtiesContext era exactamente lo que estaba buscando. Gracias. Quiero conectar automáticamente este bean porque es un DAO que entrega datos de prueba de una base de datos. – Steven

Cuestiones relacionadas