【问题标题】:Issue while running JUnit with getNamedParameterJdbcTemplate() method in Spring Batch在 Spring Batch 中使用 getNamedParameterJdbcTemplate() 方法运行 JUnit 时出现问题
【发布时间】:2014-06-15 06:35:27
【问题描述】:

我正在尝试为我的 Spring Batch 项目中的 DAO 类实现 JUnit。 因为我不想直接访问数据库,所以我在我的 JUnit 中覆盖了 jdbctemplate 类的方法。

以下是我正在使用的 DAO 类和 JUnit 代码示例

DAO 类:

班级transDaoJdbcImpl

public class transDaoJdbcImpl extends jdbcAbstractDao {

    public tranVo fetchHistory(Integer feedFileId) {
        try {
            Map<String, Object> binding = new HashMap<String, Object>();
            binding.put("ID", "value");

            return super.getNamedParameterJdbcTemplate().queryForObject(
                    this.sSQL,
                    binding,
                    new testMapper());

        } catch (Exception e) {
            e.printstacktrace();
        }
    }

}

class DistbatchAbstractDao {
    public abstract class DistbatchAbstractDao extends NamedParameterJdbcDaoSupport {
    protected int update(String sql, Map<String, ?> paramMap) throws Exception {
        try {
            return getNamedParameterJdbcTemplate().update(sql, paramMap);
        } catch (Exception e) {
            logger.error("update() error:\n" + e);
            throw e;
        }
    }

    ........
    other methods

}

JUnit 代码:

NamedParameterJdbcTemplate template = 
    new NamedParameterJdbcTemplate(Mockito.mock(DataSource.class)) {

    @Override
    public <T> T queryForObject(String sql, Map<String, ?> paramMap, RowMapper<T> rowMapper)
            throws Exception {

        return null;
    }
};
transDaoJdbcImpl() dao = new transDaoJdbcImpl() {
    @Override
    public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {

        return template;
    }
};
ReflectionTestUtils.setField(dao, "SQLName", sql);
dao.fetchHistory(1099999);

当我在 transDaoJdbcImpl 文件中运行 JUnit fetchHistory() 时。 因为我做了一个super.getNamedParameterJdbcTemplate().queryForObject,所以NamedParameterJdbcTemplate的超类方法被调用了。 我不希望这样,但我希望在我覆盖功能时调用我在JUnit 中覆盖的getNamedParameterJdbcTemplate()。 目前这没有发生,getNamedParameterJdbcTemplate()fetchHistory() 中始终为空。 谁能让我知道我该怎么做以及我上面的代码有什么问题。 任何帮助都会很棒,因为我已经坚持了很长时间。

谢谢

维肯21

【问题讨论】:

    标签: java spring batch-processing dao


    【解决方案1】:

    所以这是对我有用的解决方案。因为这是一个特殊的问题案例,我没有从任何人那里得到任何 cmets 或答案,认为对我有用的解决方案也可以帮助将来面临同样问题的任何人。

    解决方案:JUnit 代码

    private transDaoJdbcImpl dao;
    /**
     * @throws java.lang.Exception
     */
    @SuppressWarnings("unchecked")
    @Before
    public void setUp() throws Exception {
        dao=new transDaoJdbcImpl ();
        tranVo vo=new tranVo ();
        vo.setId(1);
        NamedParameterJdbcTemplate jdbcTemplateMock = Mockito.mock(NamedParameterJdbcTemplate.class);
        ReflectionTestUtils.setField(dao, "namedParameterJdbcTemplate", jdbcTemplateMock);
        Mockito.when(jdbcTemplateMock.queryForObject(Mockito.anyString(),Mockito.anyMap() ,Mockito.any(RowMapper.class))).thenReturn(vo);
    }
    
    
    @Test
    public void testFetchHistory() {
        tranVo vo=dao.retrieveLatestHistory(1);
    
        Assert.assertEquals("TEST",vo.getCd());
    }
    

    【讨论】:

    • 好答案,对我帮助很大
    • 正在努力模拟 NamedParameterJdbcDaoSupportNamedParameterJdbcTemplate。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 2018-12-20
    • 2014-04-17
    • 2014-03-19
    • 2022-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    相关资源
    最近更新 更多