AbstractTransactionalJUnit4SpringContextTests:无法获取dao来查找插入的数据

时间:2010-03-04 08:21:20

标签: unit-testing spring junit

我正在尝试使用AbstractTransactionalJUnit4SpringContextTests基类设置集成测试。我的目标非常简单:使用simpleJdbcTemplate将一些数据插入数据库,使用DAO将其读回,然后回滚所有内容。 JPA-> Hibernate是持久层。

对于我的测试,我创建了一个没有外键的数据库版本。这应该通过减少每个测试的夹具设置量来加速测试;在这个阶段,我对测试数据库完整性不感兴趣,只是测试我的HQL中的业务逻辑。

/* DAO */

@Transactional
@Repository("gearDao")
public class GearDaoImpl implements GearDao {
    @PersistenceContext
    private EntityManager entityManager;

    /* Properties go here */

    public Gear findById(Long id) {
        return entityManager.find(Gear.class, id);
    }
}

/* Test Page */

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/com/dom/app/dao/DaoTests-context.xml"})
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false)
public class GearDaoImplTests extends AbstractTransactionalJUnit4SpringContextTests   {

    @Autowired
    private GearDao gearDao;

    @Test
    @Rollback(true)
    public void quickTest() {
        String sql;
        // fields renamed to protect the innocent :-)
        sql = "INSERT INTO Gear (Gear_Id, fld2, fld3, fld4, fld5, fld6, fld7) " +
              " VALUES (?,?,?,?,?,?,?)";
        simpleJdbcTemplate.update(sql, 1L, 1L, 1L, "fld4", "fld5", new Date(), "fld7");
        assertEquals(1L, simpleJdbcTemplate.queryForLong("select Gear_Id from Gear where Gear_Id = 1"));
        System.out.println(gearDao);

        Gear gear = gearDao.findById(1L);
        assertNotNull("gear is null.", gear);  // <== This fails.
    }
}

应用程序(Spring MVC站点)与DAO一起工作正常。可能会发生什么?我会从哪里开始寻找解决方案?

  1. DAO以某种方式具有与simpleJdbcTemplate不同的dataSource。不确定这是怎么回事,因为DaoTests-context.xml文件中只定义了一个dataSource。
  2. Hibernate需要存在所有外键关系才能选择Gear对象。有几个连接不存在,因为我在fld2 / fld3 / fld4中对它们进行硬编码
  3. DAO不会对未提交的数据采取行动。但是为什么simpleJdbcTemplate会尊重这个?我认为他们都做同样的事情。
  4. 内裤侏儒。但利润在哪里?

1 个答案:

答案 0 :(得分:2)

几个小时的睡眠有什么不同。我醒来时想:“我应该检查日志以查看实际执行的查询。”当然,事实证明,hibernate被配置为为一些外键生成一些内部联接。一旦我提供了这些依赖项,它就像一个魅力。

我喜欢每个测试概念的自动回滚。集成测试,我来了!