Я пытаюсь написать тестовый пример, который проверяет, был ли документ перенесен в индекс 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());
}
Хорошо спасибо, Франциско, я попробую это позже сегодня, похоже, что это сработает. Мне просто нужно переместить некоторые вещи, потому что электронная почта на самом деле не является docId. спасибо, я вернусь к этому. –
Спасибо, я проверил это, и он работает хорошо. –
@Francisco Я не могу обновить свои зависимостей solr (в настоящее время использую 1.2.0), есть ли способ совершить транзакцию, как и мы делаем 'entityManager.flush()' для транзакций JPA? –