2017-02-25 1 views
1

Je développe une application web avec Spring Boot, et maintenant j'essaye de créer des tests pour la couche DAO, et j'aimerais utiliser différentes configurations, qui vont lire le fichier de propriétés personnalisées à la place de standard. Mais j'ai des problèmes avec ça, ça lit toujours l'application par défaut. et hibernate.properties.
Le vouloir le faire afin d'avoir différentes propriétés de hibernate.ddl-auto pour le test. Mais quand j'exécute le test, je vois que Spring lit les propriétés de hibernate.properties qui se trouve dans le dossier de ressource (j'ai volontairement fait une faute de frappe dans ce fichier afin d'obtenir une exception si elle était lue par Spring). Mais pourquoi lit-il ce fichier même lorsque j'utilise @TestPropertySource?
Je vois qu'il y a quelque chose que je ne sais pas à ce sujet, mais quoi? package src/test/java/com.guard/daoCréer un test de démarrage Spring avec application.properties séparée

@RunWith(SpringRunner.class) 
@DataJpaTest 
@Rollback 

public class LifeguardDaoTest { 
    @Autowired 
    private LifeguardDao lgDao; 

    @Test 
    public void selectTest(){ 
     for (Lifeguard lg :lgDao.getAll()) { 
      System.out.println(lg); 
     } 
    } 
}` 

classe de configuration de test est au contexte de configuration package src/test/java/com.guard

@SpringBootApplication 
@EntityScan(value = {"com.guard.dao","com.guard.model"}) 
@TestPropertySource(value = {"classpath:application-test.properties", "classpath:hibernate-test.properties"}) 
public class TestConfiguration { 
    public static void main(String[] args) { 
     ApplicationContext ctx = SpringApplication.run(TestConfiguration.class, args); 
     String[] beanNames = ctx.getBeanDefinitionNames(); 
     Arrays.sort(beanNames); 
     System.out.println("Spring boot test generated " + beanNames.length + " beans"); 

    } 
} 

test-Application Obligatoire. propriétés et hibernate-test.properties sont sur src/test/java chemin
structure du projet est ici (ne savent plus comment concevoir ici, désolé)

|src 
|--main 
|----java 
|------com.guard 
|----------configuration 
|-------------GuardApplication.class (@SpringBootApplication,requires default props) 
|--test 
|----java 
|------application-test.properties 
|-------hibernate-test.properties 
|-----com.guard 
|-------TestConfiguration.class 
|-------dao 
|---------LifeguardDaoTest.class 

Mes application-test.properties `

spring.jpa.properties.hibernate.use_sql_comments=true 

spring.jpa.hibernate.dialect=org.hibernate.dialect.HSQLDialect 
spring.jpa.hibernate.show_sql=false 
spring.jpa.hibernate.format_sql=true 
spring.jpa.hibernate.hbm2ddl-auto=create 

# even in case if it won`t use "spring.jpa" prefix 
hibernate.dialect=org.hibernate.dialect.HSQLDialect 
hibernate.show_sql=true 
hibernate.format_sql=true 

`

Répondre

3

Créer un nouveau répertoire des ressources dans le répertoire de test et de mettre vos propriétés de test fichier là-bas. Renommez également vos fichiers de propriétés en applications.properties et hibernate.properties

Les tests printaniers prendront les propriétés du répertoire test/resources /. Et dans cette approche, vous n'avez pas besoin de @TestPropertySource

0

En général, @TestPropertySource est utilisé conjointement avec @ContextConfiguration.

Essayez cette classe de configuration.

@Configuration 
@ComponentScan 
@Profile("test") 
public class TestConfiguration { 

} 

Et annotation:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@ContextConfiguration(classes = TestConfiguration.class) 
@ActiveProfiles("test") 
@TestPropertySource(locations="classpath:application-test.properties") 
public @interface IntegrationTest { } 

Ensuite, vous écrivez simplement test comme ceci:

@RunWith(SpringJUnit4ClassRunner.class) 
@IntegrationTest 
public class SomeDaoTest { 
... 
}