risposta

38

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").

+0

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'. –

+0

Ho un profilo 'prod' separato. Se inseriamo le informazioni di 'dev' in * application.properties *, queste informazioni non verrebbero perse nel profilo' test'? – Sanjay

+0

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. –

3

@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)

+1

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

+0

Basta aggiungere 'application-dev.properties' con il tuo DB MySQL e abilitare il profilo' dev' quando esegui l'app dal tuo IDE. –

+0

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

3

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 :)

17

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... 
    } 
} 
1

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.

+0

Ehi, come si imposta hsql da solo? –

+0

Ciao @AlexBondar. È possibile utilizzare l'esempio prima, ma è possibile utilizzare replace = Replace.NONE in AutoConfigureTestDatabase – bpedroso

Problemi correlati