Я использую Spring Boot 2.1.0.RELEASE и Hibernate Search 5.10.8.Final .
У меня проблема с Hibernate Search в моем интеграционный тест в Spring Boot.
Интеграционный тест
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@TestPropertySource(locations = "classpath:application-test.properties")
public class FindBookE2ETest {
private String HTTP_LOCALHOST = "http://localhost:";
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
@Sql({"/book/book.sql"})
public void findBookByLanguageTest() {
ResponseEntity<List<BookDTO>> exchange = restTemplate.exchange(HTTP_LOCALHOST + port + "/findBooks/ENG/language", HttpMethod.GET, null, new ParameterizedTypeReference<List<BookDTO>>() {});
assertThat(exchange.getStatusCode().value()).isEqualTo(HttpStatus.OK.value());
assertThat(exchange.getBody()).isNotNull();
assertThat(exchange.getBody().get(0).getLanguage()).isEqualTo("ENG");
}
}
В classpath: application-test.properties У меня есть только spring.datasource.initialization-mode = never
Реализация поиска Hibernate
@Transactional
@Service("bookService")
public class BookServiceImpl implements BookService {
@Autowired
private BookRepository bookRepository;
@PersistenceContext
private EntityManager entityManager;
private List<Book> searchBookByLanguage(String value) {
List<Book> booksByLanguages = bookRepository.findBooksByLanguages(value); //for debug test purpose
System.out.println("book from repo: " + booksByLanguages.size()); //for debug test purpose
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder()
.forEntity(Book.class)
.get();
Query luceneQuery = queryBuilder
.keyword()
.onFields("language")
.matching(value)
.createQuery();
FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, Book.class);
List<Book> resultList = jpaQuery.getResultList();
return resultList;
}
///rest of the code
}
В папке src / main / resource У меня есть data. sql file. В разделе test / resource у меня есть sql файлы для каждого теста.
Моя проблема заключается в следующем.
Когда я запускаю все приложение, все работает нормально, но в интеграционном тесте нет. В findBookByLanguageTest () поиск в спящем режиме не возвращает никаких значений (возвращает bookRepository.findBooksByLanguages ()), а я не знаю почему. Может быть, проблема в конфигурации?
Я прокомментировал spring.datasource.initialization-mode = never в свойствах теста и получил ошибку, что скрипт sql в моем тесте не может вставить данные, потому что ( Я не знаю почему) Spring получает данные из data. sql в src / main / reource / data. sql, но этот файл не находится в разделе "test". Поэтому я прокомментировал sql аннотацию выше моего теста, а также с этой конфигурацией:
# spring.datasource.initialization-mode = never в classpath: application-test.properties
и
@Test
// @Sql({"/book/book.sql"})
public void findBookByLanguageTest() {
ResponseEntity<List<BookDTO>> exchange = restTemplate.exchange(HTTP_LOCALHOST + port + "/findBooks/ENG/language", HttpMethod.GET, null, new ParameterizedTypeReference<List<BookDTO>>() {});
assertThat(exchange.getStatusCode().value()).isEqualTo(HttpStatus.OK.value());
assertThat(exchange.getBody()).isNotNull();
assertThat(exchange.getBody().get(0).getLanguage()).isEqualTo("ENG");
}
мой тест работает.
Кто-то знает, в чем проблема с моей конфигурацией? Я хочу отделить свои тесты от данных. sql и иметь скрипт sql для каждого теста. Может быть, есть проблема с EntityManager?
**** Редактировать после ответа @yrodiere ****
Я изменил свой FindBookE2ETest и теперь это выглядит так:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
@TestPropertySource(locations = "classpath:application-test.properties")
public class FindBookE2ETest {
private String HTTP_LOCALHOST = "http://localhost:";
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Autowired
private EntityManager entityManager;
@Before
public void setUp(){
entityManager = entityManager.getEntityManagerFactory().createEntityManager();
}
@Test
@Sql({"/book/book.sql"})
public void findBookByLanguageTest() {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
ResponseEntity<List<BookDTO>> exchange = restTemplate.exchange(HTTP_LOCALHOST + port + "/findBooks/ENG/language", HttpMethod.GET, null, new ParameterizedTypeReference<List<BookDTO>>() {});
assertThat(exchange.getStatusCode().value()).isEqualTo(HttpStatus.OK.value());
assertThat(exchange.getBody()).isNotNull();
assertThat(exchange.getBody().get(0).getLanguage()).isEqualTo("ENG");
}
}
Теперь все работает. Thx.