如何使用Mockito编写ResultSetExtractor的测试方法?

时间:2019-03-05 05:32:16

标签: junit mocking mockito

如何在myDAOTest类中编写一个方法以使用Mockito测试我的DAOImpl类?这是我需要从TestClass进行测试的方法。

@Override
public myCustomResponse mymethod(String query, Map<String, Object> parameters) {

    jdbcTemplate.query(query, parameters, new ResultSetExtractor<List<MyObject>>() {

        @Override
        public List<MyObject> extractData(ResultSet result) throws SQLException, DataAccessException {
            try {
                List<MyObject> myObject= new ArrayList<>();
                while (result.next()) {
                    response = getResponseDetails(result);
                }
                return myObject;
            } catch (SQLException sqlException) {
                LOG.debug(MyConstants.DATABASE_EXCEPTION_MESSAGE);
                throw new MyCustomeException(MyConstants.DATABASE_EXCEPTION_MESSAGE);
            }
        }
    });

        }
    return response;
}

1 个答案:

答案 0 :(得分:0)

可能性1:

将ResultSetExtractor提取到它自己的类中,这使得测试比作为匿名内部类要简单得多。

可能性2:

模拟jdbcTemplate,创建ArgumentCaptor,调用该方法,然后执行...

..
FROM '
 || tbl_name || ' a2 JOIN bbx_slope b
ON SDO_CONTAINS(a2.GEOMETRY, b.POINT) = ''TRUE''
WHERE a2.ID = a1.id --This one
GROUP BY a2.ID
..

这使您可以从ArgumentCaptor获取ResultSetExtractor并在其上运行测试。但这会使您的整个测试变得复杂,因此我仍然建议可能性1。

可能性3:

针对内存数据库测试整个过程,仅间接测试ResultSetExtractor。由于这似乎是Spring,因此有很容易的方法,但是,当然,您的单元测试现在将包括整个SpringApplicationContext,db等。这使其比仅包含模拟的“纯”单元测试慢。由于它是向数据库触发查询的一种方式,因此无论如何您都需要对数据库运行查询,否则您的测试将不会真正完成(通过模拟进行模拟对基础知识是有益的,但不是同一件事)。 / p>