Запретить выполнение jpa @Query в JUnit

#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:

Решение имело две части, применяемые в каждом тестовом классе:

  1. В ComponentScan репозитории должны быть исключены
     @ComponentScan(Constant.ROOT_PACKAGE   ".helper")
  

Итак, все компоненты с @Query должны находиться за пределами всех сканируемых компонентов

  1. Компоненты, автоматически подключающие репозитории в любое время, должны быть изменены, даже если они не используются
     @MockBean
    private AccountRepository accountRepositoryMock;