Как выполнить модульное тестирование сбоев соединения на источнике данных с бэкэндом Postgresql? - PullRequest
0 голосов
/ 05 сентября 2018

Чтобы протестировать поведение веб-службы при сбоях базы данных, я хотел бы смоделировать сбои соединения в моих модульных тестах. Бэкэнд базы данных - Postgresql, а код использует несколько нестандартных SQL-запросов, которые затрудняют использование ванильной базы данных в памяти для тестирования. Соединение с базой данных доступно через DataSource , который откладывает управление соединением до ConnectionPool.

Как я могу смоделировать временные / прерывистые отключения базы данных в модульном тесте, чтобы проверить правильную обработку ошибок и восстановление после сбоев подключения?

1 Ответ

0 голосов
/ 07 сентября 2018

как упомянуто @duffymo, имитация - путь.

Если бы вы действительно проводили модульное тестирование , то вы уже использовали бы Mocks, созданные с помощью среды моделирования, поскольку модульные тесты требуют изоляции отдельных модулей путем замены их зависимостей с тест удваивается . Фреймворк - самый простой и стабильный способ создания таких тестов, удваивается .

Но я думаю, что вместо этого вы Интеграционные тесты выполняются с UnitTesting Framework , называя их "модульными тестами" по любой причине.

Тем не менее ..

Поскольку ваш тест основан на реальной функциональности источников данных, шпион будет хорошим выбором, например:

class DatasourceUsageTest{    
    @Rule
    public ExpectedException exception = ExpectedException.none();
    @Test
    public void reportDatabaseOutage(){
        // arrange
        DataSource myDatasource = aquireDatasourceSomehow();
        DataSource spyOfMyDatasource = Mockito.spy(myDatasource);

        Mockito.doCallRealMethod() // first call
          .doThrow(new SqlException("Report this message") // second call (and all following) 
          .when(spyOfMyDatasource).methodExpectedToFail();

        SomeType testedUnit = createUnitAndInject(spyOfMyDatasource );

       // act call #1
       testedUnit.theMethodUsingDatasource(); 
       Mockito.verify(spyOfMyDatasource).methodExpectedToFail();

       // act call #2
       exception.expect(TheExceptionTypeToBeThrown.class);
       exception.expectMessage(EXCEPTION_MESSAGE_PREFIX + "Report this message"); 
       testedUnit.theMethodUsingDatasource(); 
      // Code below this will not be executed
    }
}

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

...