【问题标题】:How to test dao layer without marking the classes transactional如何在不将类标记为事务性的情况下测试 dao 层
【发布时间】: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


【解决方案1】:

看起来TestCustomerDao 类缺少以下注释:@TestExecutionListeners(TransactionalTestExecutionListener.class)。现在一切正常。

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 2017-06-07
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2012-01-25
    相关资源
    最近更新 更多