Модульное тестирование функции, имеющей дело с записями базы данных - PullRequest
0 голосов
/ 27 июня 2018

Модульные тесты должны проверять логику только одной функции и должны «имитировать» данные, которые используются в этой функции. Мне интересно, как бы мы соединили следующую функцию с "насмешкой" данных? или даже если это правильный путь. Сигнатура функции

    public String doSomething(int firstId, int secondId, int count){
     //this function looks in a table e.g. C which has foreign keys from table A, and B
    //if firstId and secondId exist in db table C return "already-exists"
    //if count < a_column_value_in_table_C return "not-allow"
    // else return "success"
    }

firstId и secondId являются внешними ключами из двух разных таблиц. Теперь, как нам пройти модульное тестирование этой функции с точки зрения: 1. как должен быть разработан модульный тест, чтобы в функции можно было протестировать 3 сценария 2. как мы подготовим данные для этого модульного теста, учитывая, что для него потребуются внешние ключи из двух разных таблиц.

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Вы можете использовать тестовую базу данных или базу данных в памяти (например, HSQLDB). Заполните его некоторыми тестовыми данными перед тестом (в аннотированном методе @BeforeClass или во время инициализации тестового источника данных, если вы используете Spring). Затем выполните тесты для всех ваших сценариев, передавая подготовленные данные. Очистка данных в тестовой базе данных методом, помеченным @AfterClass.

Если вы используете Spring и конфигурация в XML-конфигурации для тестового источника данных, может выглядеть так:

<jdbc:embedded-database id="dataSource" type="HSQL" >
  <jdbc:script location="scripts/ddl/*"/> <!-- create tables -->
  <jdbc:script location="scripts/dml/*"/> <!-- populate test data -->
</jdbc:embedded-database>
0 голосов
/ 27 июня 2018

Вы должны использовать внедрение зависимостей из принципов Solid. Класс, который является владельцем метода doSomething, должен внедрить некоторый репозиторий или DAO и т. Д.

В ваших юнит-тестах вы должны смоделировать методы репозитория.

Например, предположим, что ваш метод doSomething вызывает метод findById (...) хранилища. Вы должны смоделировать метод findById желаемым выводом и просто протестировать логическую часть вашего потока.

0 голосов
/ 27 июня 2018

Я обычно создаю интерфейс репозитория с помощью функции getById и getAll. Для целей тестирования я создаю хранилище памяти, а для производства я использую базу данных хранилища.

Вот пример:

public interface Repository<T> {
  public T getById(int Id);
  public List<T> getAll();
}

public InmemoryRepository implements Repository<User> {
 List<User> database = new ArrayList<>(); //with some data
 public List<User> getAll() { 
  return database;
 }
 public User get(int Id) {
   return database.stream().filter(x -> x.Id = Id).collect(Collectors.asList());
 }
}

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

public String doSomething(int firstId, int secondId, int count, Repository<User> repo){};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...