Hibernate Search в Spring Boot интеграционной тестовой задаче - PullRequest
0 голосов
/ 29 января 2020

Я использую 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...