prueba de unidad de resorte de arranque DataJpaTest volver a H2 en lugar de MySQL

paulsm4:

Tengo un poco simple "hola mundo" Primavera de arranque de aplicaciones. Tiene una sola entidad ( "IssueReport") y está configurado para ejecutar MySQL (en lugar de la base de datos integrada H2 por defecto).

La aplicación en sí funciona muy bien. He creado una base de datos MySQL y el usuario, Primavera de arranque / Hibernate crea la tabla y con éxito puebla y lee los datos de MySQL cuando corro la aplicación. La vida es buena - no hay problemas con MySQL y mi primavera de arranque en sí aplicación.

Q: Ahora cómo se utiliza MySQL (en lugar del H2 encajadas) a las pruebas unitarias?

  1. Creé una segunda base de datos, MySQL por separado: test2_test_db.

  2. Estoy usando la primavera de arranque 2.0.6; Eclipse de fotones en el STS 3.9.6; Ubuntu Linux.

  3. He creado application-test.propertiesen src/test/resources/:

    spring.datasource.url=jdbc:mysql://localhost:3306/test2_test_db
    spring.datasource.username=springuser
    spring.datasource.password=springuser
    spring.jpa.hibernate.ddl-auto=create
    
  4. Aquí está toda la prueba unitaria:

    package com.hellospring.example;
    
    import static org.assertj.core.api.Assertions.assertThat;
    import java.util.List;
    import javax.transaction.Transactional;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
    import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
    import org.springframework.test.context.ActiveProfiles;
    import org.springframework.test.context.junit4.SpringRunner;
    import com.hellospring.example.entity.IssueReport;
    import com.hellospring.example.repositories.IssueRepository;
    
    @RunWith(SpringRunner.class)
    @ActiveProfiles("test")
    @Transactional
    @DataJpaTest
    public class IssueRepositoryIntegrationTests {
    
         @Autowired
         private TestEntityManager entityManager;
    
         @Autowired
         private IssueRepository issueRepository;
    
         @Test
         public void addNewIssue() {
             System.out.println("addNewIssue()...");  // <-- This prints in the console
             final String email = "[email protected]";
             List<IssueReport> resultSet = issueRepository.findAll();  // <-- We get an exception in here...
         }  
    }
    
  5. Aquí está el error de la consola:

    2018-10-25 22:20:16.381  INFO 13637 --- [           main] c.v.e.IssueRepositoryIntegrationTests    : The following profiles are active: test
    2018-10-25 22:20:16.405  INFO 13637 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@d554c5f: startup date [Thu Oct 25 22:20:16 PDT 2018]; root of context hierarchy
    2018-10-25 22:20:17.059  INFO 13637 --- [           main] beddedDataSourceBeanFactoryPostProcessor : Replacing 'dataSource' DataSource bean with embedded version
    2018-10-25 22:20:17.060  INFO 13637 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'dataSource' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] with [Root bean: class [org.springframework.boot.test.autoconfigure.jdbc.TestDatabaseAutoConfiguration$EmbeddedDataSourceFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
    2018-10-25 22:20:17.308  INFO 13637 --- [           main] o.s.j.d.e.EmbeddedDatabaseFactory        : Starting embedded database: url='jdbc:h2:mem:979b3ce9-604e-4efd-a6d4-79576c3d67e9;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false', username='sa'
    2018-10-25 22:20:17.685  INFO 13637 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
      ...  <= I do *NOT* want H2!  I want mySQL!
    
    2018-10-25 22:20:19.315  WARN 13637 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 42102, SQLState: 42S02
    2018-10-25 22:20:19.316 ERROR 13637 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : Table "ISSUE_REPORT" not found; SQL statement:
      ...  <= Here's the exception from running the test...
    

Q: ¿Cuál es el cambio EASIEST para que pueda ejecutar mis pruebas unitarias con MySQL, así como yo soy capaz de ejecutar mi aplicación primavera de arranque con MySQL?

Q: ¿Es "@DataJpaTest" la mejor opción aquí, o debería intentar una anotación diferente?

Q: ¿Debo crear una clase separada "Bean"? Si es así, se puede apuntar a un ejemplo?

================================================== ==============

Gracias por todas sus respuestas. (Ahora suprimido) Incluyendo la respuesta de Simón Martinelli.

RESOLUCIÓN:

  1. Mi original application-test.propertiesestaba bien como está.

  2. Lo puse en el lugar equivocado: todos los archivos Application.properties para cualquier perfil normalmente debería ir en la misma carpeta del proyecto:src/main/resources

    <= EJEMPLO: src/main/resources/application-test.properties

  3. @Transactionalno era relevante aquí - lo quité. Lo guardé @ActiveProfiles("test").

  4. Por sugerencia de Karthik R, añadí @AutoConfigureTestDatabase(replace=Replace.NONE).

  5. En ese momento, la prueba de leer con éxito application-test.propertiesy MySQL utiliza en lugar de H2.

  6. anotaciones finales:

    @RunWith(SpringRunner.class)
    @ActiveProfiles("test")
    @DataJpaTest
    @AutoConfigureTestDatabase(replace=Replace.NONE)
    public class IssueRepositoryIntegrationTests {
    

He encontrado este enlace especialmente útil: Primavera de arranque - propiedades del perfil basado y el ejemplo yaml

<= Siempre he encontrado todo el material en http://www.mkyong.com muy bueno!

Karthik R:

Por defecto, los @DataJpaTestusos en la base de datos de la memoria H2 para las pruebas de pases. En caso de que tenga que utilizar el actual DB, se puede considerar o bien desactivar las configuraciones de automóviles o el uso @SpringBootTestque está habilitado todo el MVC aplicación web.

Para desactivar la configuración automática:

@RunWith(SpringRunner.class)
@ActiveProfiles("test")
@Transactional
@DataJpaTest
@AutoConfigureTestDatabase(replace=Replace.NONE)
public class IssueRepositoryIntegrationTests 

@AutoConfigureTestDatabaseconfigura la prueba H2 DB para usted. Se puede mencionar específicamente que no por encima o se puede excluir esta configuración automática como:

@EnableAutoConfiguration(exclude=AutoConfigureTestDatabase.class)

PD: : No he probado la exclusión anterior a mí mismo todavía.

Para obtener más información sobre que ir a través de javadoc: https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/autoconfigure/jdbc/AutoConfigureTestDatabase.html

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=177935&siteId=1
Recomendado
Clasificación