База данных Init перед тестами JUnit5 и Spring - PullRequest
1 голос
/ 28 июня 2019

Мой проект использует Spring, Hibernate ant JUnit 5. Каков наилучший подход к инициализации БД перед тестированием?

Вот как я устал это делать:

class DbCreatorService {
   @Autowired
   private Service1;
   @Autowired
   private Service2;
....
}

@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = "classpath:spring/applicationContext.xml")
@Transactional
class MyTest {

    @BeforeAll
    static void initDatabase(@Autowired DbCreatorService dbCreatorService ) {
        dbCreatorService.initDB()
    }
}

Когда я звоню sessionFactory.getCurrentSession() где-то в initDB(), я получаю: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread.sessionFactory вводится с помощью @ Autowired.

1 Ответ

0 голосов
/ 02 июля 2019

Чего мы пытаемся достичь?

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

Как я этого достиг

Я использовал встроенную базу данных H2 в тестовой области, с настройкой базы данных через скрипт SQL перед каждым тестовым примером.

  1. Сначала добавьте H2 в зависимости от области теста в pom.xml.(вы используете Maven, верно?).

    <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency>

  2. Затем настройте класс тестов JUnit.

SampleTestClass.java

@SpringBootTest // Allows you to autowire beans on your test class

@AutoConfigureTestDatabase // Configures a database on test scope instead of your regular database config.

@RunWith(SpringRunner.class) // Runs test context with SpringRunner.class

@SqlGroup({ // Setups .sql files to be run on specific triggers. In this case, before each test method the script will be ran.
        @Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = "classpath:beforeTest.sql"),
})

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) // The spring application context will be considered "dirty" before each test method, and will be rebuilt. It means that
// your autowired beans will not carry any data between test cases.

public class SampleTestClass {

// write your test cases here...
}
На вашем пути к классам теста добавьте файл beforeTest.sql , который будет запускаться перед каждым методом теста.Этот файл может включать создание таблицы и вставку некоторых данных для работы с вами.Если вам нужно дополнительное взаимодействие с базой данных, у вас всегда может быть метод, помеченный @Before в вашем тестовом классе.Этот метод будет запускаться перед каждым тестом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...