2015-09-13 5 views
3

Я пытаюсь написать тестовый пример, который проверяет, был ли документ перенесен в индекс SOLR. Проблема в том, что утверждение не выполняется, поскольку транзакция не была выполнена. Утверждения базы данных в порядке, они отвечают правильными номерами строк перед откатом. Но я получаю 0 счет на документы в SOLR, я полагаю, потому что, когда я запрашиваю индекс, предыдущий документ еще не был бы внесен в индекс.Интеграционный тест с данными Spring SOLR и управление транзакциями

Все условия проходят в этом тесте, за исключением последнего, который возвращает 0 счет.

Может ли кто-нибудь предложить, как я могу реализовать этот тест, чтобы учесть управление границами транзакций с требованиями SOLR и откатом?

@Test 
@Sql(scripts = {"classpath:test/sql/customers/delete_customer.sql"}) 
@Rollback 
public void testSubmitSubscriberRegistration() throws Exception{ 
    logger.entry(); 
    final String email="[email protected]"; 
    int orig = JdbcTestUtils.countRowsInTable(jdbcTemplate, "customers"); 
    MvcResult result = this.mockMvc.perform(post("/ajax/customers/register") 
        .param("firstName", "Bill") 
        .param("lastName", "Evans") 
        .param("preferredName", "Billy") 
        .param("email", email) 
        .param("subscriber", "true") 
    ) 
      .andExpect(status().isOk()) 
      .andExpect(MockMvcResultMatchers.jsonPath("$.object.id", Matchers.notNullValue())) 
        .andReturn(); 
    logger.debug(result.getResponse().getContentAsString()); 

    Assert.assertEquals(JdbcTestUtils.countRowsInTable(jdbcTemplate, "customers"), orig+1); 
    Assert.assertEquals(JdbcTestUtils.countRowsInTable(jdbcTemplate, "customer_roles"), orig+1); 
    Mockito.verify(mockCustomerNotifier, Mockito.times(1)).sendRegistrationConfirmation(Mockito.any(Customer.class), Mockito.anyString()); 

    // now we do a quick confirmation of the state of the user. 
    Customer customer = customerAccountService.findByEmail(email); 
    Assert.assertNotNull(customer); 
    Assert.assertTrue(customer.isSubscriber()); 
    Assert.assertEquals(customer.getFirstName(), "Bill"); 
    Assert.assertEquals(customer.getLastName(), "Evans"); 
    Assert.assertEquals(customer.getEmail(), email); 
    boolean found = false; 
    for (Role role: customer.getRoles()) 
    { 
     if (role.getCode().equals("REGISTERED_CUSTOMER")){ 
      found = true; 
     } 
    } 

    Assert.assertTrue(found); 

    // now we have to verify the search indexes were updated with the customer details. 
    Assert.assertNotNull(customerDocumentRepository); 
    List<CustomerDocument> customerDocuments = customerDocumentRepository.findByEmail(email); 
    Assert.assertEquals(1, customerDocuments.size()); 

} 

ответ

1

Solr имеет особенность имена RealTimeGet, это может быть использовано для получения документов, которые уже отправлены Solr, но до сих пор не совершал.

Spring-Data-Solr Этот признак представлен в разделе RealTime Get. С помощью этой функции вы можете получить документ на основе его идентификатора даже до совершения транзакции.

Пример:

CustomerDocument consumerDocument = solrTemplate.getById(email, CustomerDocument.class); 
Assert.assertNotNull(consumerDocument); 
+0

Хорошо спасибо, Франциско, я попробую это позже сегодня, похоже, что это сработает. Мне просто нужно переместить некоторые вещи, потому что электронная почта на самом деле не является docId. спасибо, я вернусь к этому. –

+0

Спасибо, я проверил это, и он работает хорошо. –

+0

@Francisco Я не могу обновить свои зависимостей solr (в настоящее время использую 1.2.0), есть ли способ совершить транзакцию, как и мы делаем 'entityManager.flush()' для транзакций JPA? –

0

Ниже следует совершить Solr-транзакцию, а затем вы можете запросить Solr

solrTemplate.commit(); 

пример кода будет выглядеть следующим образом:

@Test 
public void testSomething(){ 
    createMyBeanAndSaveIt(); 

    solrTemplate.commit(); 

    solrTemplate.query... 
} 

Для других спотыкаясь по этому вопросу выше мы это сделали.

Смежные вопросы