2012-03-30 9 views
7

En el siguiente código el problema es que no puedo probar dao.add() sin usar dao.list(). Size() y viceversa.¿Cómo probar "agregar" en DAO sin usar "buscar", etc.?

¿Este enfoque es normal o incorrecto? Si es incorrecto, ¿cómo se puede mejorar?

public class ItemDaoTest { 

    // dao to test 
    @Autowired private ItemDao dao; 

    @Test 
    public void testAdd() { 
     // issue -> testing ADD but using LIST 

     int oldSize = dao.list().size(); 
     dao.add(new Item("stuff")); 
     assertTrue (oldSize < dao.list().size()); 
    } 

    @Test 
    public void testFind() { 
     // issue -> testing FIND but using ADD 

     Item item = new Item("stuff") 
     dao.add(item); 
     assertEquals(item, dao.find(item.getId())); 
    } 
} 
+0

¿Estás buscando pruebas de integración o unidad? – davidfrancis

+0

Dígame :) En este escenario en particular, usar solo el sentido común me parece más una prueba de integración. Pero ya sabes, después de todo, solo quiero asegurarme de que mi DAO funcione, eso es todo. – Xorty

+0

Sí, es un dolor. No estoy seguro de que pueda terminar con pruebas unitarias debido a la dependencia que tiene el dao. ¿Cómo funciona el dao? Personalmente, intentaría evitar que tu prueba dependa de una base de datos externa e intentará colgar o burlar la capa de acceso a la base de datos, como se sugiere en una de las respuestas. Habiendo dicho eso, nunca es tan tranquilizador como una verdadera prueba de integración dependiente de db. – davidfrancis

Respuesta

2

Creo que su prueba son pruebas de integración válidas como se indicó anteriormente, pero yo usaría Add para ayudar en la prueba de Find y viceversa .. En cierto nivel, debe permitirse confiar en su nivel más bajo de integración a su dependencia externa. Me doy cuenta de que hay una dependencia de otros métodos en sus pruebas, pero encuentro que los métodos Agregar y Buscar son métodos de "bajo nivel" que son muy fáciles de verificar. Básicamente se prueban entre sí, ya que son básicamente métodos inversos.

Agregar puede construir fácilmente las condiciones previas para encontrar

find puede verificar que un complemento fue un éxito.

No puedo pensar en un escenario en el que un fallo en cualquiera de los dos no sería atrapado por su prueba

0

Utilizo JDBC directo (utilizando Spring's JdbcTemplate) para probar los métodos DAO. Quiero decir que llamo a los métodos DAO (que son base de Hibernate) y luego los confirmo usando llamadas SQL directas de JDBC.

+1

Pero eso significa agregar líneas de código JDBC no probado por el simple hecho de probar ...: | – Xorty

1

Su método testAdd tiene un problema: depende de la suposición de que ItemDao.list funciona correctamente y, sin embargo, ItemDao es la clase que está probando. Las pruebas unitarias deben ser independientes, por lo que un mejor enfoque es usar JDBC simple, como dijo @Amir, para verificar si el registro se introdujo en la base de datos.

Si está utilizando Spring, puede retransmitir en AbstractTransactionalDataSourceSpringContextTests para acceder a las instalaciones de JDBCTemplate y asegurar una reversión después de que se ejecutó la prueba.

0

La unidad más pequeña bajo prueba para las pruebas unitarias basado en la clase es una clase.

Para ver por qué, considere que, en teoría, podría probar cada método de la clase de forma aislada de todos los otros métodos evitándolos, anudándolos o burlándolos. Algunas herramientas pueden no ser compatibles con eso; esto es teoría, no práctica, supongo que lo hacen.

Aun así, hacer las cosas de esa manera sería una mala idea. La especificación de una función individual por sí misma variará entre vagamente sin sentido y ampliamente incomprensible. Solo en el patrón de interacción entre las diferentes funciones existirá una especificación más simple que el código que puede usar de manera rentable para probarla.

Si agrega un artículo y la cantidad de elementos informados aumenta, las cosas funcionan. Si hay alguna manera en que las cosas no pueden funcionar, pero todos los patrones de interacción se mantienen, entonces se está perdiendo alguna prueba necesaria.

Cuestiones relacionadas