Используйте репозитории Spring Data для заполнения тестовых данных - PullRequest
0 голосов
/ 18 октября 2018

Я хотел бы спросить, можно ли использовать репозитории приложений (на основе Spring Data) для заполнения данных тестирования.Я знаю, что могу использовать файл sql с данными, но иногда мне нужно что-то более динамичное.Я считаю, что писать определения sql или наборов данных громоздко (и трудно поддерживать в случае изменения схемы).Что-то не так с использованием репозиториев приложений?Там уже есть все основные операции CRUD.Обратите внимание, что мы говорим, в частности, об интеграционном тестировании.

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

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Нет, в использовании репозиториев Spring Data для создания тестовых данных нет абсолютно ничего плохого.

Я даже предпочитаю это, поскольку он часто позволяет упростить рефакторинг.

Как и при любом использовании JPAв тестах нужно помнить, что реализации JPA являются кэшем с обратной записью.Возможно, вы захотите очистить и очистить EntityManager после настройки тестовых данных, чтобы вы не получили ничего из кэша 1-го уровня, которое действительно должно исходить из базы данных.Кроме того, это обеспечивает фактическую запись данных в базу данных и возникновение проблем с ними.

Возможно, вас заинтересует пара статей о тестировании с Hibernate .Они не используют Spring Data, но он будет работать с Spring Data JPA точно так же.

0 голосов
/ 18 октября 2018

Я бы порекомендовал использовать Flyway для настройки ваших баз данных и использовать Расширение теста Flyway для интеграционного тестирования.

Чтобы вы могли сделать что-то подобное:

@ContextConfiguration(locations = {"/context/simple_applicationContext.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
    FlywayTestExecutionListener.class})
@Test
@FlywayTest(locationsForMigrate = {"loadmsql"}) // execution once per class
public class MethodTest extends AbstractTestNGSpringContextTests {

  @BeforeClass
  @FlywayTest(locationsForMigrate = {"loadmsql"}) // execution once per class
  public static void beforeClass() {
    // maybe some additional things
  }

  @BeforeMethod
  @FlywayTest(locationsForMigrate = {"loadmsql"}) // execution before each test method
  public void beforeMethod() {
    // maybe before every test method
  }


  @Test
  @FlywayTest(locationsForMigrate = {"loadmsql"}) // as method annotation
  public void simpleCountWithoutAny() {
    // or just with an annotation above the test method where you need it
  }
...