【发布时间】:2017-10-28 18:10:03
【问题描述】:
我应该为 DAO 层编写单元测试。我有这样的 DAO 类:
@Repository
public class CustomerDaoImpl implements CustomerDao {
@PersistenceContext
private EntityManager em;
// some methods ...
}
ApplicationContext.java 中的应用上下文配置如下:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
@ComponentScan(basePackages = "/*censored*/")
public class ApplicationContext {
@Bean
public JpaTransactionManager transactionManager() {
return new JpaTransactionManager(entityManagerFactory().getObject());
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean jpaFactoryBean = new LocalContainerEntityManagerFactoryBean();
jpaFactoryBean.setDataSource(db());
jpaFactoryBean.setLoadTimeWeaver(instrumentationLoadTimeWeaver());
jpaFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
return jpaFactoryBean;
}
@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
@Bean
public LoadTimeWeaver instrumentationLoadTimeWeaver() {
return new InstrumentationLoadTimeWeaver();
}
@Bean
public DataSource db() {
EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.DERBY).build();
return db;
}
}
而测试类是这样的:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ApplicationContext.class)
public class TestCustomerDao extends AbstractTestNGSpringContextTests
{
@Autowired
private CustomerDao customerDao;
@Test
public void someTest() {
// ... some test
}
}
如何运行单元测试而无需使用@Transactional 注解标记 DAO 类?
我在其他 SO 帖子中读到 @Transactional 应该在服务层级别使用。但是,我应该为 DAO 层编写测试,没有任何服务层。
如果我不使用 @Transactional 注释标记 DAO 类,我会收到以下错误:javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call 从 DAO 类中调用 em.persist(entity) 的方法中出现。
对不起,如果这是一个愚蠢的问题,但我是新手。
【问题讨论】:
标签: java spring unit-testing jpa testing