Come configurare la mia applicazione Spring Boot in modo che quando eseguo i test unitari userà un database in memoria come H2/HSQL ma quando avvierò l'applicazione Spring Boot userà database di produzione [Postgre/MySQL]?Configurare il database specifico in memoria a scopo di test in primavera
risposta
I profili a molla possono essere utilizzati per questo. Questo sarebbe un modo specifico: ambiente
hanno proprietà specifiche file:
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
applicazione -test.properties
spring.jpa.database: HSQL
avere sia MySQL e H2 piloti pom.xml
, come questo:
<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>
Ultimo ma non meno importante, annotare le classi di test con @ActiveProfiles("test")
.
@Sanjay ha un modo per dirlo ma lo trovo confuso. Si potrebbe altrettanto bene avere solo un profilo production
che si attiva quando si è in produzione, qualcosa di simile a:
spring.jpa.hibernate.ddl-auto: update
spring.datasource.url: jdbc:mysql://localhost:3306/dbname
spring.datasource.username: username
spring.datasource.password: password
e non specificare nient'altro. Se aggiungi un database incorporato nello scope test
, sarà disponibile nei tuoi test. Se si eseguono i test con il profilo predefinito (nessuna personalizzazione di sorta), non troverà alcuna informazione sul database (poiché questi sono memorizzati nel profilo production
). In tal caso, cercherà di trovare un database incorporato e avviarlo per te. Se avete bisogno di più di personalizzazione, per qualche motivo, si può avere un application-test.properties
per chi (è necessario aggiungere ActiveProfiles("test")
per il test (s)
Nei miei scenari, avrei un database MySQL nel mio PC, che verrebbe utilizzato durante l'esecuzione locale dell'app durante lo sviluppo. Ecco perché pensavo che avessimo bisogno di un profilo 'dev' per eseguire l'app e un profilo' test' per eseguire i test attraverso il mio IDE. Qualunque semplificazione potrebbe essere fatta in questo caso? – Sanjay
Basta aggiungere 'application-dev.properties' con il tuo DB MySQL e abilitare il profilo' dev' quando esegui l'app dal tuo IDE. –
Ok, quello che capisco allora è che la mia risposta sopra sembra adatta a questo caso, tranne che avrei potuto saltare con il profilo 'test' e' @ ActiveProfile' se il profilo 'test' non aveva nulla tranne il DB. Fammi sapere se questo suona male. – Sanjay
soluzione semplice se edificio con maven
:. Il posto giusto un file di application.properties
sotto src/test/resources
e modifica come appropriato per i test
Il meccanismo di profilo Spring (Boot) è uno strumento piuttosto potente che, in ambito, va ben oltre "lo scambio delle impostazioni tra tempo di test e tempo di esecuzione" .Perché, chiaramente, come dimostrato, può fallo anche :)
Un altro approccio è aggiungere l'annotazione @AutoConfigureTestDatabase
al test classe. miei test di solito hanno questo aspetto: soluzione
@RunWith(SpringRunner.class)
@DataJpaTest
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2)
public class MyRepositoryTest {
@Autowired
MyRepository repository;
@Test
public void test() throws Exception {
// Tests...
}
}
più semplice:
1) in src/main/risorse hanno application.properties (config produzione):
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
e l'applicazione-test .gli oggetti con HSQL config come:
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) Aggiungere HSQL dipendenza nel pom.xml se non lo avete già.
3) Annotare la classe di test con @ActiveProfiles ("test").
Ha funzionato come il fascino nel mio caso.
Ehi, come si imposta hsql da solo? –
Ciao @AlexBondar. È possibile utilizzare l'esempio prima, ma è possibile utilizzare replace = Replace.NONE in AutoConfigureTestDatabase – bpedroso
Il profilo 'dev' mi sembra strano. Non dovrebbe essere quello "di produzione"? In questo caso, inserisci le informazioni in 'application.properties', non c'è bisogno di' spring.profiles.active'. –
Ho un profilo 'prod' separato. Se inseriamo le informazioni di 'dev' in * application.properties *, queste informazioni non verrebbero perse nel profilo' test'? – Sanjay
Tutto quello che sto dicendo è che non stai rispondendo alla domanda. Dev/test è confuso nella tua risposta. Mi aspetterei un profilo prod e quindi un profilo di test ma non uno "Dev". Si potrebbe anche avere un profilo "prod" con la produzione e lasciare il default per il test. Poiché Spring Boot non trova alcuna informazione specifica, userà il contenitore incorporato. –