2015-10-13 65 views
0

如果项目在“spring-boot:run”maven指令下运行,我有以下类可按预期工作。没有XML Spring-data-jpa数据源和Junit测试(ManagedType失败)

但现在我试图创建一些测试情况一样好做法,我努力使JUnit的理解我的XML-较少的配置...以下是相关代码:

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories(entityManagerFactoryRef = "emfIntranet", transactionManagerRef = "tmIntranet", basePackages = {"com.vnt.intranet.repositories"}) 
@ConfigurationProperties(prefix = "databases.sistemas") 
public class IntranetPersistence { 

    private String address; 
    private String schema; 
    private String username; 
    private String password; 
    private String eclipselinklog; 
    private Boolean sqllog; 

    @Primary 
    @Bean(name = "dsIntranet") 
    DataSource dataSource() { 
     BasicDataSource dataSource = new BasicDataSource(); 
     dataSource.setUrl("jdbc:postgresql://" + address + "/" + schema); 
     dataSource.setUsername(username); 
     dataSource.setPassword(password); 
     dataSource.setDriverClassName("org.postgresql.Driver"); 
     dataSource.setInitialSize(3); 
     dataSource.setMaxIdle(3); 
     dataSource.setMaxTotal(10); 
     return dataSource; 
    } 

    private EclipseLinkJpaVendorAdapter getEclipseLinkJpaVendorAdapter() { 
     EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter(); 
     vendorAdapter.setDatabasePlatform("org.eclipse.persistence.platform.database.PostgreSQLPlatform"); 
     vendorAdapter.setShowSql(sqllog); 
     return vendorAdapter; 
    } 

    @Primary 
    @Bean(name = "emfIntranet") 
    EntityManagerFactory entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); 
     factoryBean.setJpaVendorAdapter(getEclipseLinkJpaVendorAdapter()); 
     factoryBean.setDataSource(dataSource()); 
     factoryBean.setPackagesToScan("com.vnt.intranet.entities"); 

     Properties jpaProperties = new Properties(); 
     jpaProperties.put("eclipselink.weaving", "false"); 
     jpaProperties.put("eclipselink.logging.level", eclipselinklog); 

     factoryBean.setJpaProperties(jpaProperties); 
     factoryBean.afterPropertiesSet(); 
     return factoryBean.getObject(); 
    } 

    @Primary 
    @Bean(name = "tmIntranet") 
    PlatformTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory()); 
     return transactionManager; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public String getSchema() { 
     return schema; 
    } 

    public void setSchema(String schema) { 
     this.schema = schema; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getEclipselinklog() { 
     return eclipselinklog; 
    } 

    public void setEclipselinklog(String eclipselinklog) { 
     this.eclipselinklog = eclipselinklog; 
    } 

    public Boolean getSqllog() { 
     return sqllog; 
    } 

    public void setSqllog(Boolean sqllog) { 
     this.sqllog = sqllog; 
    } 
} 

测试用例:

@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = {Application.class}, initializers =  ConfigFileApplicationContextInitializer.class) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class ServiceOrderRepositoryTest { 

    private static Logger logger = LoggerFactory.getLogger(ServiceOrderRepositoryTest.class); 

    @Autowired 
    ServiceOrderRepository serviceOrderRepository; 

    @Test 
    public void serviceOrderTest() { 
     ServiceOrder serviceOrderList = serviceOrderRepository.findOne(51152L); 
     logger.debug("{}", serviceOrderList); 
     assertThat(serviceOrderList, is(not(nullValue()))); 
    } 
} 

错误:

Caused by: java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.vnt.mkdata.entities.ServiceOrder] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.vnt.mkdata.entities.ServiceOrder</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 

这测试用例会的工作,当然,如果我创建一个persistence.xml文件,但这正是点,我不想要一个...

任何人都可以帮助我吗?

回答

0

原来,我们需要为数据源提供一个唯一的PersistenceUnitName ...显然,从“spring-boot:run”运行时它会更自动化,并且它是自动创建的。

所以,我刚刚添加了“factoryBean.setPersistenceUnitName(”some-unique-name“);”到每个数据源

factoryBean.setPackagesToScan("com.vnt.intranet.entities"); 
factoryBean.setPersistenceUnitName("intranet");