Burlándose de origen de datos para JdbcTemplate con Mockito

Estoy tratando de poner a prueba una clase en un proyecto de Primavera. Me gustaría hacer tantos cambios como sea posible en la clase de prueba contra el dao de la clase, de modo que no tengo que volver a probar todo tipo de cosas a causa de un cambio.

La clase con la que estoy trabajando tiene un JdbcTemplate template variable de clase que es instanciado por el siguiente:

setJdbcTemplate(DataSource dataSource) {
    this.template = new JdbcTemplate(dataSource);
}

El método me gustaría probar hace un template.query(<code>) para ejecutar un definido SQL de la consulta y devolver los resultados en una lista.

He creado el siguiente en mi caso de prueba, pero no estoy seguro de cómo ponerlo en uso. Puedo hacer el siguiente código de retorno de una determinada lista de Cadenas utilizando Mockito?

DataSource mockedDataSrc = Mockito.mock(DataSource.class);
customerClassDao.setJdbcTemplate(mockedDataSrc); 

Puedo utilizar alguna de las when o de otro comando para establecer lo que quiero ser devuelto a la JdbcTemplate del .query llamar?

InformationsquelleAutor Kyle | 2013-03-27

2 Kommentare

  1. 2

    Usted no puede hacer esto porque usted no tiene control sobre el JdbcTemplate aplicación. Usted debe dependencia inyectar el JdbcTemplate y, a continuación, se burlan de la JdbcTemplate lugar.

    Esta dificultad está señalando un problema con el código. El código depende del hormigón instancia de JdbcTemplate. Sería menos unida si se utiliza la Inyección de Dependencia en su lugar.


    Ya que no desea modificar su sistema bajo prueba, usted puede hacer esto:

    Cambiar el template campo del paquete protegido (es decir: eliminar la palabra clave privada). Entonces, me gustaría ponerlo en un simulacro(JdbcTemplate.class) después de crear instancias de la clase que se está probando. Ahora usted será capaz de utilizar cuando y comprobar en el JdbcTemplate directamente como se quería en un principio.

    Por lo que la clase que estamos probando tendrá este aspecto:

    public class SystemUnderTest {
    
    JdbcTemplate jdbcTemplate;
    
        public void setJdbcTemplate(DataSource dataSource) {
            this.template = new JdbcTemplate(dataSource);
        }
    
    }

    Y su prueba de ello:

    @Before
    public void setUp() {
        SystemUnderTest sut = new SystemUnderTest();
        sut.jdbcTemplate = mock(JdbcTemplate.class);                
    }
    
    //...
    • La fuente de datos es inyectado a través de la Primavera a través de la applicationContext.xml. No estoy seguro de por qué se eligió sólo a inyectar en el origen de datos en lugar de los jdbcTemplate, pero yo estaba tratando de ser capaces de poner a prueba mi método que escribí sin tener que cambiar/refactorizar mucho más de el código. Como cambiar mi realidad sólo afecta a 1 de SQL llamada en el método 1.
    • ¿Su prueba de fallo si se burlan de el origen de los datos y pasar justo ahora? Si no, hay algunas cosas que usted puede hacer, pero necesito saber eso primero.
    • No estrellarse, sólo dice que el éxito. Pensé que no tenía a dónde ir desde aquí, yo soy muy nuevo en Mockito/jUnit. He estado Googleando un par de horas y todavía bastante no he averiguado dónde ir además de las dos líneas que mostré anteriormente.
    • Gracias, me dirigí en la dirección correcta. Muy apreciada.
  2. 3

    Si estás probando un DAO no tiene sentido en absoluto para burlarse de la fuente de datos. ¿Qué están las pruebas? Usted necesita hacer un DAO que interactúa con la base de datos.

    Una vez que el trabajo, usted está libre para burlarse de las basadas en la interfaz DAO al probar los servicios que la utilizan. Has probado ya el DAO; no hay ninguna razón para rehacerlo cuando las pruebas de los servicios.

    Yo diría que estás fuera de la pista si estás burlando de el origen de datos cuando se prueba el DAO.

    • Podría ser útil para probar un RowMapper o algún otro código en el DAO que toma el conjunto de resultados y construye algo distinto de una vainilla de respuesta de las consultas.
    • Si el DAO obras en las que se puede simular el conjunto de resultados O incluir la RowMapper en el DAO de las pruebas.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea