2016-11-13 40 views
0

我想在每次測試後回滾數據庫,但它不起作用,我試過不同類型的事務管理配置。 createNewItem method對象仍在其他測試中顯示。Java spring Junit事務不會回滾數據庫

回滾的目的是讓有exacly相同的數據庫對象,並預計新的ID,每次考試

ContextConfiguration:

@Configuration 
@EnableJpaRepositories("se.system.repository") 
@EnableTransactionManagement 
public class ContextConfiguration{ 

@Bean(name = "hsqldb") 
public DataSource InMemoryDataSource() { 
    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
    EmbeddedDatabase database = builder.setType(EmbeddedDatabaseType.HSQL) 
      .addScript("classpath:se/system/sql/create-db.sql") 
      .addScript("classpath:se/system/sql/insert-data.sql").build(); 

    return database; 
} 

@Bean 
public PlatformTransactionManager transactionManager(EntityManagerFactory factory) { 
    return new JpaTransactionManager(factory); 
} 


@Bean 
public JpaVendorAdapter jpaVendorAdapter() { 

    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); 
    adapter.setDatabase(Database.HSQL); 
    adapter.setShowSql(false); 
    adapter.setGenerateDdl(false); 
    return adapter; 
} 

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
    factory.setDataSource(InMemoryDataSource()); 
    factory.setJpaVendorAdapter(jpaVendorAdapter()); 
    factory.setPackagesToScan("se.system.model"); 
    return factory; 
} 

與HSQLDB JUnit測試:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {ContextConfiguration.class }) 
@TestExecutionListeners 
@Transactional 
public class ServiceTest { 

@Rule 
public ExpectedException thrown = ExpectedException.none(); 

private static Service service; 

private static AnnotationConfigApplicationContext context; 

@BeforeClass 
public static void setup() { 
    context = new AnnotationConfigApplicationContext(); 
    context.register(ContextConfiguration.class); 
    context.scan("se.system"); 
    context.refresh(); 
    Service = context.getBean(Service.class); 
} 


@Test 
public void createNewItem() { 

    System.out.println(((List<Item>) service.getAllitem()).size()); 
    Item item = Service 
      .saveOrUpdateItem(new Item("Title", "Description")); 
    System.out.println(Item); 
    assertEquals(new Long(4L), Item.getId()); 
} 
+0

嗨,你在哪裏設置自動提交到假的? – jay

+0

嘿,我也在尋找那個,但是我沒有找到把它變成虛假的地方,所以我認爲它默認已經是假的。 – T3rraform

+0

您可以使用saveOrUpdateItem方法發佈服務類代碼嗎? – qwerty

回答

0

這就是我通常註釋我的測試類的方法:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = { JPAUnitTestConfiguration.class }) 
@Transactional //rollback if exception occurs during test method 
@TransactionConfiguration(defaultRollback = true) //rollback at end of method 
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) 
public class FooBarTest { 
} 

將@TransactionConfiguration(defaultRollback = true)添加到您的測試類。

我的交易配置:

import java.sql.SQLException; 

import javax.sql.DataSource; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.FilterType; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; 
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import ch.ams.pois.repository.AuthTokenRepository; 
import ch.ams.pois.repository.GroupRepository; 
import ch.ams.pois.repository.InvitationRepository; 
import ch.ams.pois.repository.LocationRepository; 
import ch.ams.pois.repository.UserRepository; 


@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(basePackages = JPAConfiguration.JPA_REPOSITORIES_BASE_PACKAGES, 
includeFilters = @ComponentScan.Filter(value = { 
     UserRepository.class, LocationRepository.class, 
     GroupRepository.class, AuthTokenRepository.class, 
     InvitationRepository.class }, 
     type = FilterType.ASSIGNABLE_TYPE)) 
public class JPAUnitTestConfiguration extends JPAConfiguration { 

    @Bean 
    public DataSource dataSource() throws SQLException { 
     EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); 
     return builder.setType(EmbeddedDatabaseType.H2).build(); 
    } 
} 

爲持久層的依賴:

<dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
      <version>1.3.4.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate.javax.persistence</groupId> 
      <artifactId>hibernate-jpa-2.0-api</artifactId> 
      <version>1.0.1.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>4.0.1.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <version>1.3.173</version> 
     </dependency> 
     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <version>9.2-1003-jdbc4</version> 
     </dependency> 
+0

它仍然不會回滾,並且TransactionConfiguration已棄用 – T3rraform

+0

當前是否適合您,如果可以,您是否可以分享如何配置事務管理? – T3rraform

+0

它適用於我。剛剛測試過它。但我使用較舊的庫,因爲該項目不再被更新。 – qwerty