#spring-boot #junit #h2
#весенняя загрузка #junit #h2
Вопрос:
У меня есть проект Spring Boot (версия 2.3.1.RELEASE), и я пытаюсь написать тесты JUnit, не использующие базы данных (все издеваются).
Для этого я настроил среду junit H2 в качестве базы данных
spring.datasource.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.datasource.url=jdbc:h2:mem:db;TRACE_LEVEL_FIlE=4
spring.datasource.username=sa
spring.datasource.password=
И с этим вполне обычным репозиторием
public interface AccountRepository extends JpaRepository<Account, Long> {
@Query("SELECT A FROM Account A WHERE "
"A.state='PENDING' AND "
"P.origin='WS' AND "
"UPPER(P.type)='R'")
public List<Account> pending();
}
Мой тестовый контроллер начинается с
@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = LoadBranchesController.class)
@ComponentScan(basePackages = { Constant.ROOT_PACKAGE })
@TestPropertySource(locations = "classpath:application-junit.properties")
class LoadBranchesControllerTest {
Моя проблема возникает, когда я запускаю ControllerTests в тестах junit. При начальной загрузке он жалуется:
2020-10-20 20:37:38 WARN - WARN - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 42102, SQLState: 42S02
2020-10-20 20:37:38 ERROR - ERROR - org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Table "AP_ACCOUNTS" not found; SQL statement:
Это происходит потому, что он пытается проверить этот запрос. Но H2 пуст (так, как я этого хочу).
Есть ли способ отключить выполнение запроса JpaRepositories при начальной загрузке?
Ответ №1:
Решение имело две части, применяемые в каждом тестовом классе:
- В ComponentScan репозитории должны быть исключены
@ComponentScan(Constant.ROOT_PACKAGE ".helper")
Итак, все компоненты с @Query должны находиться за пределами всех сканируемых компонентов
- Компоненты, автоматически подключающие репозитории в любое время, должны быть изменены, даже если они не используются
@MockBean
private AccountRepository accountRepositoryMock;