2017-11-02 1 views
1

Dieser Fehler tritt bei this.itemRepository.deleteAll() auf, wenn sampleTest() Methode ausgeführt wird.Kein EntityManager mit aktueller Transaktion für aktuellen Thread verfügbar

@ExtendWith(SpringExtension.class) 
@TestInstance(TestInstance.Lifecycle.PER_CLASS) 
@SpringBootTest 
@DataJpaTest 
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) 
@Rollback(false) 
public class ScheduleTests { 

    private static final Logger LOGGER = LoggerFactory.getLogger(ScheduleTests.class); 

    @Autowired 
    private ScheduleRepository scheduleRepository; 

    @Autowired 
    private ItemRepository itemRepository; 

    @Autowired 
    private ItemQualifierRepository itemQualifierRepository; 

    @Autowired 
    private MappingRepository mappingRepository; 

    @BeforeAll 
    public void setUp() { 
     restoreInitialData(); 
     LOGGER.info("Initial data restored"); 
    } 

    @Test 
    public void sampleTest() { 
     File feed = new File("target/test-classes/TestFeedOK.json"); 
     Feed.ingest(feed); 
     LOGGER.info("Feed {} ingested", feed.getName()); 
    } 

    private void restoreInitialData() { 
     this.itemRepository.deleteAll(); 
     this.mappingRepository.deleteByTableName("event"); 
    } 
} 

Hinzufügen @Transactional Anmerkung zu restoreInitialData() löst nicht das Problem - https://stackoverflow.com/a/32552558/3536552

Wissen Sie, wie man es beheben?

+0

haben Sie versucht, die ganze Klasse zu machen '@ Traansactional'? – pvpkiran

+0

@pvpkiran Ja, ich habe versucht, aber es hat nicht geholfen – TheChosenOne

+0

welche Version von Spring Boot verwenden Sie. Weil in der neuesten Version 'AutoConfigureTestDatabase' veraltet ist – pvpkiran

Antwort

0

Ich denke, das Problem ist restoreInitialData heißt setup, die eine @ BeforeAll-Methode ist. Spring ist an diesem Punkt nicht eingetreten, um eine Transaktion zu erstellen. Ändern Sie dies einfach in @BeforeEach und überprüfen Sie dies auch mit @Transactional. Wenn Sie möchten, dass etwas nur einmal ausgeführt wird. Versuchen Sie diesen Ansatz

private static boolean setUpIsDone = false; 
..... 
public void setUp() { 
    if (setUpIsDone) { 
     return; 
    } 
    // do the setup 
    setUpIsDone = true; 
} 
+0

Es funktioniert, aber gibt es elegantere Lösung? – TheChosenOne

+0

Ich fürchte nicht. – pvpkiran

0

standardmäßig Frühling bietet Implementierungen von Interface und Class aber mit der Testumgebung Frühling erwarten Sie ihre Umsetzung sorgen. Verwenden Sie den folgenden Code, um EntityManager Implementierung bereitzustellen.

PersistenceJPAConfig.java

import java.util.Properties; 

import javax.persistence.EntityManagerFactory; 
import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.env.Environment; 
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.JpaVendorAdapter; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; 
import org.springframework.transaction.PlatformTransactionManager; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

@Configuration 
@EnableTransactionManagement 
public class PersistenceJPAConfig { 

    @Autowired 
    private Environment environment; 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); 
     em.setDataSource(dataSource()); 
     em.setPackagesToScan(new String[] { "com.example.db.model" }); 

     JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); 
     em.setJpaVendorAdapter(vendorAdapter); 
     em.setJpaProperties(additionalProperties()); 
     return em; 
    } 

    @Bean 
    public DataSource dataSource() { 
     String driverClassName = environment.getProperty("spring.datasource.driverClassName"); 
     String url = environment.getProperty("spring.datasource.url"); 
     String username = environment.getProperty("spring.datasource.username"); 
     String password = environment.getProperty("spring.datasource.password"); 

     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(driverClassName); 
     dataSource.setUrl(url); 
     dataSource.setUsername(username); 
     dataSource.setPassword(password); 

     return dataSource; 
    } 

    @Bean 
    public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(emf); 

     return transactionManager; 
    } 

    @Bean 
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() { 
     return new PersistenceExceptionTranslationPostProcessor(); 
    } 

    Properties additionalProperties() { 
     Properties properties = new Properties(); 
     properties.setProperty("hibernate.id.new_generator_mappings","false"); 
     return properties; 
    } 
} 
Verwandte Themen