unitarios unitarias test pruebas framework curso java spring spring-mvc spring-boot spring-test

java - test - pruebas unitarias spring boot



¿Cómo recrear la base de datos antes de cada prueba en Spring? (5)

Mi aplicación Spring-Boot-Mvc-Web tiene la siguiente configuración de base de datos en el archivo application.properties :

spring.datasource.url=jdbc:h2:tcp://localhost/~/pdk spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver

Esta es la única configuración que hice. No hay ninguna otra configuración hecha por mí en cualquier lugar. No obstante, Spring y los subsistemas se vuelven a crear automáticamente en cada aplicación web. La base de datos se vuelve a crear, es decir, en la ejecución del sistema mientras contiene datos después de que finaliza la aplicación.

No entendía estos valores predeterminados y esperaba que esto fuera adecuado para las pruebas.

Pero cuando comencé a ejecutar pruebas descubrí que la base de datos solo se recreaba una vez. Dado que las pruebas se ejecutan sin un orden predefinido, esto no tiene ningún sentido.

Entonces, la pregunta es: ¿cómo hacer que tenga sentido? Es decir, ¿cómo hacer que la base de datos se vuelva a crear antes de cada prueba a medida que se produce al iniciar la aplicación?

El encabezado de mi clase de prueba es el siguiente:

@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = myapp.class) //@WebAppConfiguration @WebIntegrationTest @DirtiesContext public class WebControllersTest {

Como ves, probé @DirtiesContext a nivel de clase y no sirvió de nada.

ACTUALIZAR

Tengo un frijol

@Service public class DatabaseService implements InitializingBean {

el cual tiene un metodo

@Override @Transactional() public void afterPropertiesSet() throws Exception { log.info("Bootstrapping data..."); User user = createRootUser(); if(populateDemo) { populateDemos(); } log.info("...Bootstrapping completed"); }

Ahora hice el método populateDemos() para borrar todos los datos de la base de datos. Desafortunadamente, no se llama antes de cada prueba a pesar de @DirtiesContext . ¿Por qué?


¿Si usa spring.jpa.hibernate.ddl-auto=create-drop debería ser suficiente para crear / eliminar la base de datos?


A menos que esté utilizando algún tipo de integración Spring-Data (que no sé en absoluto), esto parece una lógica personalizada que necesitará para implementarse. Spring no conoce sus bases de datos, esquemas y tablas.

Suponiendo que JUnit, escriba los @Before apropiados @Before y @Before para configurar y limpiar su base de datos, sus tablas y sus datos. Sus pruebas pueden escribir ellos mismos los datos que necesitan, y potencialmente limpiar después de sí mismos si es apropiado.


Con Spring Boot, la base de datos h2 se puede definir de forma única para cada prueba. Simplemente anule la URL de la fuente de datos para cada prueba

@SpringBootTest(properties = {"spring.config.name=myapp-test-h2","myapp.trx.datasource.url=jdbc:h2:mem:trxServiceStatus"})

Las pruebas pueden ejecutarse en paralelo.

Dentro de la prueba los datos pueden ser restablecidos por

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)


En realidad, creo que quieres esto:

@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)

http://docs.spring.io/autorepo/docs/spring-framework/4.2.6.RELEASE/javadoc-api/org/springframework/test/annotation/DirtiesContext.html

@DirtiesContext se puede usar como una anotación de nivel de clase y de método dentro de la misma clase. En tales escenarios, el ApplicationContext se marcará como sucio después de cualquier método anotado así como después de toda la clase. Si DirtiesContext.ClassMode se establece en AFTER_EACH_TEST_METHOD, el contexto se marcará como sucio después de cada método de prueba en la clase.


Para crear la base de datos, debe hacer lo que dicen las otras respuestas con spring.jpa.hibernate.ddl-auto=create-drop , ahora, si su intención es agrupar la base de datos en cada prueba, la primavera proporciona una anotación muy útil.

@Transactional(value=JpaConfiguration.TRANSACTION_MANAGER_NAME) @Sql(executionPhase=ExecutionPhase.BEFORE_TEST_METHOD,scripts="classpath:/test-sql/group2.sql") public class GroupServiceTest extends TimeoffApplicationTests {

esto es de este paquete org.springframework.test.context.jdbc.Sql; y puede ejecutar un método de prueba anterior y un método de prueba posterior. Para rellenar la base de datos.

Con respecto a la creación de la base de datos cada vez, Diga que solo desea que su prueba tenga la opción de crear y soltar, puede configurar sus pruebas con propiedades personalizadas con esta anotación.

@TestPropertySource(locations="classpath:application-test.properties") public class TimeoffApplicationTests extends AbstractTransactionalJUnit4SpringContextTests{

Espero eso ayude