NO XML Spring-data-jpa 数据源和 Junit 测试(ManagedType 失败)

NO XML Spring-data-jpa datasources and Junit tests (ManagedType fail)

如果项目在 "spring-boot:run" maven 指令下 运行,我有以下 类 按预期工作。

但现在我正在尝试创建一些测试用例作为良好实践,我正在努力让 JUnit 理解我的 XML-less 配置...这是相关代码:

@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 文件,这个测试用例就可以工作,但这正是重点,我不想要一个...

有人可以帮我吗?

原来需要为数据源提供唯一的 PersistenceUnitName...显然,当 运行 来自 "spring-boot:run" 时,某些东西会更加自动化,并且它是自动神奇地创建的。

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

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