3

ドキュメントが SOLR インデックスにプッシュされたかどうかを確認するテスト ケースを作成しようとしています。問題は、トランザクションがコミットされていないためにアサーションが失敗していることです。データベースのアサーションは問題なく、ロールバックの前に正しい行数で応答します。しかし、SOLR のドキュメントで 0 カウントを取得しています。これは、インデックスをクエリしたときに、前のドキュメントがまだインデックスにコミットされていないためだと思います。

このテストでは、0 カウントを返す最後の条件を除いて、すべての条件に合格します。

SOLR とロールバック要件を備えたトランザクション境界管理を考慮して、このテストを実装する方法を誰か提案できますか?

@Test
@Sql(scripts = {"classpath:test/sql/customers/delete_customer.sql"})
@Rollback
public void testSubmitSubscriberRegistration() throws Exception{
    logger.entry();
    final String email="Billy.Evans@mailinator.com";
    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());

}
4

2 に答える 2

1

Solr にはRealTimeGetという機能名があり、これを使用して、既に solr に送信されているがまだコミットされていないドキュメントを取得できます。

Spring-Data-Solrは、 RealTime Getセクションに記載されているように、この機能を提供します。この機能を使用すると、トランザクションがコミットされる前でも、ID に基づいてドキュメントを取得できます。

例:

CustomerDocument consumerDocument = solrTemplate.getById(email, CustomerDocument.class);
Assert.assertNotNull(consumerDocument);
于 2015-09-15T18:50:08.150 に答える
0

以下はsolr-transactionをコミットする必要があり、Solrにクエリを実行できます

solrTemplate.commit();

サンプル コードは次のようになります。

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

  solrTemplate.commit();

  solrTemplate.query...
}

この問題に出くわした他の人のために、上記は私たちがしたことです.

于 2016-01-18T09:09:52.397 に答える