Uso de @Sql en Spring Boot Test

springboot with @sql

springboot with @sql


Siguiendo con artículos de testing en Spring Boot en este artículo vamos a ver el uso de @Sql en Spring Boot Test.

En el artículo siguiente veremos como haciendo uso de diferentes anotaciones relacionadas con @Sql como @SqlConfig o @SqlMergeMode y también @SlqGroup en nuestros test integrados. De esta manera podremos probar diferentes escenarios y configuraciones para nuestros test, teniendo diferentes datos para diferentes casos en nuestra base de datos de prueba.

Uso de @Sql en Test Integrados con Spring Boot Test

Añadir la anotación Sql en nuestros test de Spring Boot nos va a permitir ejecutar sentencias y comandos SQL en nuestra base de datos para nuestros test.

La anotación SQL puede traer las siguientes configuraciones:
config: Permite configurar la ejecución del script, en lugar de hacer uso de @SqlConfig.
executionPhase: Permite establecer cuando ejecutar el script, por defecto es BEFORE_TEST_METHOD.
statements: Configura las sentencias en línea para que se ejecuten.
scripts: Configura el path.
value: Es el alias.

@Sql({ "/drop_schema.sql", "/create_schema.sql" })
@Sql(scripts = "/insert_data.sql", statements = "insert into car(id, brand) values (100, 'Ford')")
@SpringJUnitConfig(TestConfig.class)
public class SqlTest {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Test
	public void testCarEngine() {

	}

	@Sql(scripts = "/insert_data3.sql", config= @SqlConfig(commentPrefix = "~"))
	@Test
	public void testCarColor() {
	}
} 

A continuación vamos a ver diferentes configuraciones haciendo uso de las anotaciones @SqlConfig, @SqlGroup y @SqlMerge junto con la anotación @Sql

Anotación @SqlConfig en nuestros test integrados con @Sql

La anotación @SqlConfig puede ir a nivel de clase o de método, en el caso en el que se especifique a nivel de método prevalecerá sobre el nivel de la clase. Define el metadata sobre como se van a ejecutar los scripts.

Esta anotación nos permite indicar como serán los comentarios, los errores, el encoding o los separadores de nuestro script:

blockCommentStartDelimiter: Delimitador de inicio para el bloque de comentarios. Por defecto es (/*).
blockCommentEndDelimiter: Delimitador de fin para el bloque de comentarios. Por defecto es (*/).
commentPrefix: Prefijo para una única línea de comentario por defecto es (–).
commentPrefixes: Permite definir múltiples prefijos para una línea de comentarios. Por defecto es [«–«].
dataSource: Define el nombre del datasource contra el que se ejecutará el script.
encoding: El encoding usado para el script SQL, solo es necesario si el encoding va a ser diferente del de la plataforma.
errorMode: Configuración del modo de error.
separator: Define el separador por defecto es (/n).
transactionManager: Si tenemos más de un transaction manager, podemos definir aquí el nombre del bean.
transactionMode: Define el modo de la transacción, es decir, si lo vamos a ejecutar dentro de la misma transacción.

Por ejemplo:

@SqlConfig(commentPrefix = "#")
@Sql({ "/drop_schema.sql", "/create_schema.sql" })
@Sql(scripts = { "/insert_data2.sql" })
@SpringJUnitConfig(TestConfig.class)
public class SqlConfigTest {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Test
	public void testCarEngine() {

	}

	@Sql(scripts = "/insert_data3.sql", config= @SqlConfig(commentPrefix = "~"))
	@Test
	public void testCarColor() {
	}
} 

Con el código anterior lo que vamos a hacer es cargar un script sql teniendo en cuenta que los comentarios que contenga nuestro script comenzarán con # a nivel de clase, y para el método en concreto que se van a ejecutar comenzarán con

Uso de @SqlMergeMode en nuestros test con @Sql

La anotación @SqlMergeMode que ha sido introducida a partir de la versión 5.2 de Spring nos permite ejecutar scripts específicos para el método deseado. Es decir, podemos ejecutar o sobre escribir scripts de sql haciendo uso de esta anotación.

El siguiente se ejecutaría a nivel de método

@SpringJUnitConfig(TestConfig.class)
@Sql("/test-schema.sql")
class CarTests {

    @Test
    @Sql("/car-test-data-001.sql")
    @SqlMergeMode(MERGE) 
    void loadCarType() {
    }
}

La anotación @SpringJUnitConfig combina las siguientes dos anotaciones:

– @ExtendWith(SpringExtension.class)

– @ContextConfiguration

A continuación el siguiente fragmento se ejecutaría a nivel de clase:

@SpringJUnitConfig(TestConfig.class)
@Sql("/test-schema.sql")
@SqlMergeMode(MERGE) 
class UserTests {

    @Test
    @Sql("/car-test-data-001.sql")
    void loadCarType() {
    }
}

@SqlGroup usado con @Sql

El uso de la anotación @SqlGroup nos va a permitir añadir varias anotaciones de sql (@sql) anidadas.

@SqlGroup({
    @Sql({ "/drop.sql", "/create_schema.sql" }),
    @Sql("/insert_data.sql")
})

Conclusión sobre el uso de @Sql en Spring Boot Test

En esta entrada hemos visto el Uso de @Sql en Spring Boot Test, esta funcionalidad nos ayudará para realizar y crear testing con diferentes datos para nuestra base de datos.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!


Deja una respuesta

Tu dirección de correo electrónico no será publicada.