2016-08-07 27 views
3

Ich möchte Maven mit anderem Profil laufen, aber es scheint nicht zu funktionieren. Ich habe 2 differents Java-Klasse für meine JPAConfiguration:Eclipse Maven: Lauftest mit Federprofil

JPAConfiguration.class und JPAConfigurationTest.class

@Configuration 
@Profile({"dev"}) 
@EnableTransactionManagement(proxyTargetClass = true) 
@EnableJpaRepositories(basePackages = { "com.jle.athleges.model.repository", "com.jle.athleges.security.repository" }) 
@ComponentScan(basePackages = { "com.jle.athleges.model.services", "com.jle.athleges.security.services" }) 
public class JpaConfiguration { 

    @Bean 
    public DataSource dataSource() throws SQLException { 
     System.out.println("use dev"); 
     EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
     builder.setName("dev"); 
     return builder.setType(EmbeddedDatabaseType.H2).build(); 
    } 

    @Bean 
    public EntityManagerFactory entityManagerFactory() throws SQLException { 

     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     vendorAdapter.setGenerateDdl(true); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setPackagesToScan("com.jle.athleges.model.entity", "com.jle.athleges.security.entity"); 
     factory.setDataSource(dataSource()); 
     factory.afterPropertiesSet(); 
     return factory.getObject(); 

    } 

    @Bean 
    public EntityManager entityManager(EntityManagerFactory entityManagerFactory) { 
     return entityManagerFactory.createEntityManager(); 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() throws SQLException { 
     JpaTransactionManager txManager = new JpaTransactionManager(); 
     txManager.setEntityManagerFactory(entityManagerFactory()); 
     return txManager; 
    } 

    @Bean 
    public HibernateExceptionTranslator hibernateExceptionTranslator() { 
     return new HibernateExceptionTranslator(); 
    } 

} 

@Configuration 
@Profile({"test"}) 
@EnableTransactionManagement(proxyTargetClass = true) 
@EnableJpaRepositories(basePackages = { "com.jle.athleges.model.repository", "com.jle.athleges.security.repository" }) 
@ComponentScan(basePackages = { "com.jle.athleges.model.services", "com.jle.athleges.security.services" }) 
public class JpaConfigurationTest { 

    @Bean 
    public DataSource dataSource() throws SQLException { 
     System.out.println("use test"); 
     EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
     builder.setName("test"); 
     return builder.setType(EmbeddedDatabaseType.H2).build(); 
    } 

    @Bean 
    public EntityManagerFactory entityManagerFactory() throws SQLException { 

     HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     vendorAdapter.setGenerateDdl(true); 

     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setJpaVendorAdapter(vendorAdapter); 
     factory.setPackagesToScan("com.jle.athleges.model.entity", "com.jle.athleges.security.entity"); 
     factory.setDataSource(dataSource()); 
     factory.afterPropertiesSet(); 
     return factory.getObject(); 

    } 

    @Bean 
    public EntityManager entityManager(EntityManagerFactory entityManagerFactory) { 
     return entityManagerFactory.createEntityManager(); 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager() throws SQLException { 
     JpaTransactionManager txManager = new JpaTransactionManager(); 
     txManager.setEntityManagerFactory(entityManagerFactory()); 
     return txManager; 
    } 

    @Bean 
    public HibernateExceptionTranslator hibernateExceptionTranslator() { 
     return new HibernateExceptionTranslator(); 
    } 

} 

In meinem pom.xml, ich habe dies:

<project> 

… 

<dependencies> 

… 

</dependencies> 

    <profiles> 
     <profile> 
      <id>dev</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 
     </profile> 
     <profile> 
      <id>test</id> 
     </profile> 
    </profiles> 


    <build> 
     <finalName>AthleGes</finalName> 
     <pluginManagement> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <version>${maven-compiler-plugin.version}</version> 
        <configuration> 
         <source>1.8</source> 
         <target>1.8</target> 
         <debug>true</debug> 
        </configuration> 
       </plugin> 

      </plugins> 
     </pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>${maven-war-plugin.version}</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.eclipse.jetty</groupId> 
       <artifactId>jetty-maven-plugin</artifactId> 
       <version>${jetty-maven-plugin.version}</version> 
       <configuration> 
        <jettyEnvXml>src/test/resources/jetty-env.xml</jettyEnvXml> 
        <scanIntervalSeconds>10</scanIntervalSeconds> 
        <stopKey>foo</stopKey> 
        <stopPort>9999</stopPort> 
       </configuration> 
       <executions> 
        <execution> 
         <id>start-jetty</id> 
         <phase>pre-integration-test</phase> 
         <goals> 
          <goal>run</goal> 
         </goals> 
         <configuration> 
          <scanIntervalSeconds>0</scanIntervalSeconds> 
          <daemon>true</daemon> 
         </configuration> 
        </execution> 
        <execution> 
         <id>stop-jetty</id> 
         <phase>post-integration-test</phase> 
         <goals> 
          <goal>stop</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

Und schließlich, ich habe eine Testklasse:

@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles(profiles = {"test","dev"}) 
@ContextConfiguration(classes = { JpaConfigurationTest.class, JpaConfiguration.class, SecurityConfig.class }) 
@TestExecutionListeners({ 
     DependencyInjectionTestExecutionListener.class, 
     DirtiesContextTestExecutionListener.class, 
     TransactionalTestExecutionListener.class, 
     }) 
public class MemberServiceImpTest { 

    static Logger log = LoggerFactory.getLogger(MemberServiceImpTest.class); 

    @Autowired 
    private MemberService memberService; 

    @Autowired 
    private MemberRepository repository; 

    @Before 
    public void setUp(){ 
     repository.deleteAll(); 
    } 

    @Test 
    public void saveMember() { 

     log.debug("Start saveMember"); 
     Member a = new Member(); 
     a.setFirstname("aaa"); 
     a.setLastname("hhh"); 
     a.setId(0L); 

     Assert.assertNotNull(memberService.save(a)); 

     log.debug("End saveMember"); 
    } 

    @Test 
    public void getAllMembers() { 
     log.debug("Start getAllMember"); 

     long sizeBefore = repository.count(); 
     Member a = new Member(); 
     a.setFirstname("aaa"); 
     a.setLastname("hhh"); 
     a.setId(2L); 

     Member b = new Member(); 
     b.setFirstname("aaa"); 
     b.setLastname("hhh"); 
     b.setId(1L); 
     memberService.save(a); 
     memberService.save(b); 

     Assert.assertEquals(memberService.getAll().size(),sizeBefore + 2); 
     log.debug("End getAllMember"); 
    } 
} 

Wenn ich meinen Komponententest f Von Eclipse funktioniert es gut. Wenn ich das Profil in der Testklasse von Dev zu Test und von Test zu Dev verschiebe, funktioniert es. Ich meine den Testlauf und die angezeigte Meldung "Use dev" oder "Use test" wird angezeigt.

Ich möchte die Tests von Maven (mit M2e) laufen und ich erstellt diese Konfiguration:

Eclipse-Maven-Configuration

Aber wenn ich das Profil zu ändern, Test wird immer gestartet.

Ich habe versucht, Profil von Maven zu aktivieren -> Select Maven Profile, aber ich habe das gleiche Ergebnis.

Ich vermisse etwas, aber ich weiß nicht was. Ich verstehe nicht.

Können Sie mir helfen?

Dank

Antwort

6

Wie pro Ihre Konfiguration @ActiveProfiles sowohl die Profile werden während des Testdurchführung aktiviert werden. Wenn Sie das aktive Spring-Profil für Testfälle über Maven steuern möchten, würde ich Ihnen empfehlen, @ActiveProfiles Annotation aus Ihrer Testklasse zu entfernen und spring.profiles.active als Systemeigenschaft anzugeben.

Set es im Maven todsichere Plugin configurtion:

<project> 
    <properties> 
     <spring.profiles.active>dev</spring.profiles.active> 
    </properties> 

    <profiles> 
     <profile> 
     <id>dev</id> 
     <activation> 
      <property> 
       <name>spring.profiles.active</name> 
       <value>dev</value> 
      </property> 
     </activation> 
     </profile> 
     <profile> 
     <id>test</id> 
     <activation> 
      <property> 
       <name>spring.profiles.active</name> 
       <value>test</value> 
      </property> 
     </activation> 
     </profile> 
    </profiles> 

     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <argLine>-Dspring.profiles.active=${spring.profiles.active}</argLine> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 

</project> 

Sie einfach Maven Test ausführen können, wie Sie tun dies bereits, indem spring.profiles Man könnte es eine der folgenden Arten tun verwenden. aktiver Parameter ohne den Profilnamen. Profil wird automatisch mit Wert der Eigenschaft spring.profiles.active

aktiviert

ODER

Direkt zu todsichere Plugin durch Maven Parameter während der Ausführung wie:

mvn -DargLine = "- Dspring.profiles.active = dev "

+0

Vielen Dank für Ihre Hilfe sehr. Ich benutze nicht (vorerst) Maven im Befehl, sondern mit Eclipse. Also laufe ich nicht direkt lvn, ich benutze m2e. Es funktioniert nicht vollständig mit allen Lösungen: 1) Ich habe @ActiveProfile in JUnit Test entfernt und ich habe spring.profiles.active (dev) in Eclipse Run Configuration Environment hinzugefügt. (es funktioniert) 2) Ich aktualisierte pom.xml durch Hinzufügen der Eigenschaft spring.profiles.active in den Einstellungen und es funktioniert. 3) Ich konfigurierte Profile mit dev-, test- und surfire-Plugin und Entfernen von Einstellungen Eigenschaft, aber wenn ich maven mit der Umgebung laufen, es nicht den definierten Parameter verwenden. –

+0

Schließlich muss ich spring.profiles.active in jeder Maven-Konfiguration definieren. Es funktioniert aber auch nicht so wie ich es möchte. vielen Dank. –