Тестирование метода execute () с использованием макетов для JDBC - PullRequest
1 голос
/ 20 марта 2019

У меня есть метод, который выполняет инструкцию SQL, используя Statement.execute (запрос). Как проверить эту пустую функцию, поскольку она ничего не возвращает? Я использую Mockito и @ Spy.

Прикрепил мой фрагмент кода для моего метода execute (), который принимает ArrayList запросов:

public void execute(Statement statement, ArrayList<String> queryList) throws SQLException {
        SQLException sqlException = null;
        // read script line by line
        for (String line : queryList) {
            try {
                statement.execute(line);
            } catch (SQLException e1) {
                if (null == sqlException)
                    sqlException = e1;
                else {``
                    sqlException.addSuppressed(e1);
                }
            }
        }
        if (null != sqlException)
            throw sqlException;
    }

Это мой тестовый класс, который мне нужно использовать для тестирования метода void execute () в моем основном классе. Я использую Mocking и doNothing (), но получаю ненужное исключение Stubbing.

    @ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)
public class TestSQL {

    @Spy
    RunSQL runSQL=new RunSQL("dbConfig");
    @Mock
    BufferedReader br;
    @Spy
    ArrayList<String> queryList;
    @Mock
    Statement s;
    @Mock
    Connection c;
    @Mock
    RunSQL runsql;
    @Test
    public void testExecute() throws SQLException, IOException {
        Mockito.when(br.readLine()).thenReturn("something");
        runSQL.execute(s, queryList);
        Mockito.doNothing().when(runsql).execute(s,queryList);
    }
 }

1 Ответ

0 голосов
/ 20 марта 2019

Обычный путь выполнения может быть проверен следующим образом:

@ExtendWith(MockitoExtension.class)
@RunWith(JUnitPlatform.class)
public class RunSQLTest {
    @Test
    public void queries_are_executed_one_by_one() throws SQLException {
        //given:
        RunSQL runSQL = new RunSQL("dbConfig");
        List<String> queries = new ArrayList<>();
        queries.add("query1");
        queries.add("query2");
        Statement statement = mock(Statement.class);

        //when:
        runSQL.execute(statement, queries);

        //then:
        verify(statement, times(1)).execute("query1");
        verify(statement, times(1)).execute("query2");
        verifyNoMoreInteractions(statement);
    }
}

Здесь вы просто строго утверждаете, что все ваши запросы выполняются один за другим без каких-либо исключений.Строгость достигается добавлением verifyNoMoreInteractions(statement).Если вы не добавите это, то Mockito сделает все возможное, чтобы заглушить фиктивные взаимодействия.Это поведение по умолчанию

...