Простой способ заполнить ResultSet данными

Петля j является виновником. Программа будет обрабатывать каждую строку сканирования width * factor раз вместо factor раз. Он добавляет дополнительные width итераций к каждой линии сканирования.

21
задан approxiblue 22 March 2016 в 21:49
поделиться

5 ответов

DBUnit не Насколько мне известно, набор результатов не представлен хотя это хорошо поможет вам заполнить вашу базу данных в памяти.

Я бы сказал, что насмешливый фреймворк - неправильный подход на данном этапе. Мокинг - это тестирование поведения и взаимодействия, а не просто возврат данных, поэтому он, скорее всего, будет мешать вам.

Вместо этого я бы либо реализовал интерфейс набора результатов, либо создал динамический прокси интерфейса набора результатов для класса, который реализует методы, которые вам нужны, без необходимости реализовывать весь набор результатов. Вы, вероятно, обнаружите, что поддерживать класс так же просто, как поддерживать базу данных в памяти (при условии, что тестируемый набор данных согласован), и, вероятно, легче отлаживать.

Вы можете создать резервную копию этого класса с помощью DBUnit, где вы сделаете снимок ваш набор результатов с помощью dbunit, и dbunit прочитал его во время теста из xml, и пусть ваш фиктивный набор результатов считывает данные из классов dbunit. Это был бы разумный подход, если бы данные были умеренно сложными.

Я бы выбрал базу данных в памяти, если бы классы были настолько связаны, что им нужно было читать данные, которые были изменены как часть того же теста. Даже тогда я бы подумал об использовании копии реальной базы данных, пока вам не удастся отделить эту зависимость.

Простой метод генерации прокси:

private static class SimpleInvocationHandler implements InvocationHandler {
    private Object invokee;

    public SimpleInvocationHandler(Object invokee) {
        this.invokee = invokee;
    }

    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        method = invokee.getClass().getMethod(method.getName(), method.getParameterTypes());
        if (!method.isAccessible()) {
            method.setAccessible(true);
        }
        try {
            return method.invoke(invokee, args);
        } catch (InvocationTargetException e) {
            throw e.getTargetException();
        }
    }
}

public static <T> T generateProxy(Object realObject, Class... interfaces) {
    return (T) Proxy.newProxyInstance(realObject.getClass().getClassLoader(), interfaces, new SimpleInvocationHandler(realObject));
}
11
ответ дан 29 November 2019 в 06:34
поделиться

Я добился успеха с классом MockResultSet отсюда: http://mockrunner.sourceforge.net/ . Он позволяет вам создать класс, реализующий интерфейс ResultSet, и позволяет вам устанавливать значения для каждого столбца и строки.

Если ваши методы работают с ResultSets разумного размера, вы должны иметь возможность создавать тесты, которые довольно легко возвращают нужные вам значения.

Вот простой пример:

MockResultSet rs = new MockResultSet("myMock");

rs.addColumn("columnA", new Integer[]{1});
rs.addColumn("columnB", new String[]{"Column B Value"});
rs.addColumn("columnC", new Double[]{2});

// make sure to move the cursor to the first row
try
{
  rs.next();
}
catch (SQLException sqle)
{
  fail("unable to move resultSet");
}

// process the result set
MyObject obj = processor.processResultSet(rs);

// run your tests using the ResultSet like you normally would
assertEquals(1, obj.getColumnAValue());
assertEquals("Column B Value", obj.getColumnBValue());
assertEquals(2.0d, obj.getColumnCValue());
38
ответ дан 29 November 2019 в 06:34
поделиться

Если возможно, вы могли бы взять набор результатов, который у вас есть сейчас, из реального источника данных, сериализовать его и сохраните файл. Затем вы можете десериализовать этот набор результатов для каждого из ваших модульных тестов, и все будет в порядке.

2
ответ дан 29 November 2019 в 06:34
поделиться

Пока вы не вызываете большинство методов ResultSet , я бы, вероятно, просто загрузил текстовый файл с разделителями в двумерный массив и реализовал методы Мне действительно было нужно, оставив остальное, чтобы выбросить UnsupportedOperationException (которое является реализацией по умолчанию для заглушенных методов в моей среде IDE).

1
ответ дан 29 November 2019 в 06:34
поделиться

Mockrunner может загрузить файл CSV или XML и автоматически создавать mockresult. Он также может высмеивать подключение и оператор, поэтому все ваши вещи JDBC просто работает, даже не добавляя драйвера JDBC на ваш класс.

6
ответ дан 29 November 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: