如何为ClassNotFoundExceptions编写适当的单元测试?

时间:2015-07-23 13:09:42

标签: java unit-testing junit

我想测试出现以下行的方法:

try (Connection connection = dataSource.getConnection()) {
        ((org.postgresql.PGConnection) connection).addDataType("geometry", Class.forName("org.postgis.PGgeometry"));
        ((org.postgresql.PGConnection) connection).addDataType("box3d", Class.forName("org.postgis.PGbox3d"));

        try (Statement statement = connection.createStatement()) {
            /*
             * 4326 is the ID of a format in which the longitude and latitude values should be
             * retreived.
             */
            String sqlQuery = "SELECT ST_Transform(way, 4326) FROM planet_osm_line WHERE (highway='footway' OR highway='steps');";
            ResultSet resultSet = statement.executeQuery(sqlQuery);

            while (resultSet.next()) {
                PGgeometry geom = (PGgeometry) resultSet.getObject(1);
                LineString line = (LineString) geom.getGeometry();
                Point[] wayPoints = line.getPoints();

                pointList.add(wayPoints);
            }
        }
    } catch (SQLException | ClassNotFoundException e) {
        throw new OpenStreetMapDAOException(e.getMessage(), e);
    }

这些线条迫使我抓住ClassNotFoundException,即Class.forName("name")的召唤就是这样。

我的测试中从未达到catch ClassNotFoundException的情况,因为这些类始终存在。 有没有办法测试我的catch区块?

2 个答案:

答案 0 :(得分:1)

由于org.postgresql.PGConnection似乎是一个界面,你可以尝试通过Mockito或类似的模拟框架来模拟它。

org.postgresql.PGConnection connection = Mockito.mock(org.postgresql.PGConnection.class)
Mockito.doThrow( ...your exception here...).when( connection ).addDataType("geometry", Class.forName("org.postgis.PGgeometry"));

使用这两行,您将为您的连接创建一个模拟对象,然后您可以在方法中使用它。当使用这些参数调用该方法时,此模拟对象将抛出给定的异常。

答案 1 :(得分:0)

我重构了我的问题中的代码,直到我为关键部分找到了以下方法,即那些Class.forName("some.class.name")调用:

Statement createStatement() throws SQLException, ClassNotFoundException {
    Connection connection = dataSource.getConnection();

    ((org.postgresql.PGConnection) connection).addDataType("geometry", Class.forName("org.postgis.PGgeometry"));
    ((org.postgresql.PGConnection) connection).addDataType("box3d", Class.forName("org.postgis.PGbox3d"));

    return connection.createStatement();
}

在我的单元测试中,我使用了

when(dao.createStatement()).thenThrow(ClassNotFoundException.class);

终于解决了我的问题。