Uso de @Sql en Spring Boot Test
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!