tutorial proyecto mvc framework español ejemplo crear spring spring-boot spring-data spring-test spring-test-dbunit

proyecto - Configurar la base de datos de memoria específica para fines de prueba en Spring



spring mvc 4 tutorial español (5)

¿Cómo configuro mi aplicación Spring Boot para que cuando ejecute pruebas unitarias use una base de datos en memoria como H2 / HSQL pero cuando ejecuto la aplicación Spring Boot use la base de datos de producción [Postgre / MySQL]?


@Sanjay tiene una forma de decirlo, pero me parece confuso. También podría tener solo un perfil de production que habilite cuando esté en producción, algo así como:

spring.jpa.hibernate.ddl-auto: update spring.datasource.url: jdbc:mysql://localhost:3306/dbname spring.datasource.username: username spring.datasource.password: password

Y no especifique nada más. Si agrega una base de datos incrustada en el alcance de la test , estará disponible en sus pruebas. Si ejecuta sus pruebas con el perfil predeterminado (sin personalización alguna), no encontrará ninguna información de base de datos (ya que están almacenadas en el perfil de production ). En ese caso, tratará de encontrar una base de datos integrada y comenzarla por usted. Si necesita más personalización por algún motivo, puede tener una application-test.properties para eso (deberá agregar ActiveProfiles("test") a su (s) prueba (s).


La solución más simple:

1) en src / main / resources tiene application.properties (configuración de producción):

spring.datasource.url=jdbc:mysql://localhost:3306/somedb spring.datasource.username=root spring.datasource.password=password spring.datasource.driverClassName=com.mysql.jdbc.Driver spring.jpa.database-platform = org.hibernate.dialect.MySQL5Dialect

y application-test.properties con configuración de HSQL como:

spring.jpa.hibernate.ddl-auto = create-drop spring.jpa.database = HSQL spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.HSQLDialect spring.datasource.driverClassName = org.hsqldb.jdbcDriver spring.datasource.url: jdbc:hsqldb:mem:scratchdb spring.datasource.username = sa spring.datasource.password =

2) Agregue dependencia HSQL en pom.xml si no lo tiene ya.

3) Anote su clase de prueba con @ActiveProfiles ("prueba").

Funcionó como el encanto en mi caso.


Los perfiles de resorte se pueden usar para esto. Esta sería una forma específica:

Tener archivos de propiedades específicas del entorno:

application.properties :

spring.profiles.active: dev

application-dev.properties

spring.jpa.database: MYSQL spring.jpa.hibernate.ddl-auto: update spring.datasource.url: jdbc:mysql://localhost:3306/dbname spring.datasource.username: username spring.datasource.password: password

application-test.properties

spring.jpa.database: HSQL

Tenga ambos controladores MySQL y H2 en pom.xml , así:

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>test</scope> </dependency>

Por último, pero no menos importante, anota las clases de prueba con @ActiveProfiles("test") .


Otro enfoque es agregar la anotación @AutoConfigureTestDatabase a la clase de prueba. Mis pruebas generalmente se ven así:

@RunWith(SpringRunner.class) @DataJpaTest @AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2) public class MyRepositoryTest { @Autowired MyRepository repository; @Test public void test() throws Exception { // Tests... } }


Solución simple si se construye con maven : simplemente coloque un archivo application.properties bajo src/test/resources y edítelo según corresponda para la prueba.

El mecanismo Spring (Boot) Profile es una herramienta bastante poderosa que, en su alcance, va más allá de "intercambiar configuraciones entre el tiempo de prueba y el tiempo de ejecución". Aunque, claramente, como se demostró, también puede hacerlo :)