2017-11-02 9 views
1

sampleTest()メソッドを実行するとthis.itemRepository.deleteAll()にこのエラーが発生します。 restoreInitialData()@Transactional注釈を追加現在のスレッドで実際のトランザクションが使用可能なEntityManagerがありません

@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"); 
    } 
} 

は、問題を解決していません - あなたはそれを修正する方法をhttps://stackoverflow.com/a/32552558/3536552

知っていますか?

+0

あなたはTraansactional' @ 'クラス全体を作ってみたのですか? – pvpkiran

+0

@pvpkiranはい私は試みたが、それは助けなかった – TheChosenOne

+0

どのバージョンのスプリングブートを使用しています。最新の 'AutoConfigureTestDatabase'が廃止されたので – pvpkiran

答えて

0

restoreInitialDataは、@BeforeAllメソッドであるsetupから呼び出されます。 トランザクションを作成するために、その時点でSpringがステップインしていません。これを@BeforeEachに変更し、@Transactionalでチェックしてください。 何かを一度だけ実行したい場合。 InterfaceClassの実装を提供するデフォルトのスプリングによって、このアプローチ

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

それは動作しますが、より洗練されたソリューションがありますか? – TheChosenOne

+0

私は恐れていません。 – pvpkiran

0

を試してみたが、テスト環境スプリングを使用すると、その実装を提供することを期待。したがって、次のコードを使用してEntityManagerの実装を提供してください。

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; 
    } 
} 
関連する問題