6

私は統合テストを書いていますが、あるテスト方法では、DB にデータを書き込んでから読みたいと思っています。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
@TransactionConfiguration()
@Transactional
public class SimpleIntegrationTest {

    @Resource
    private DummyDAO dummyDAO;

    /**
     * Tries to store {@link com.example.server.entity.DummyEntity}.
     */
    @Test
    public void testPersistTestEntity() {
        int countBefore = dummyDAO.findAll().size();
        DummyEntity dummyEntity = new DummyEntity();
        dummyDAO.makePersistent(dummyEntity);

        //HERE SHOULD COME SESSION.FLUSH()

        int countAfter = dummyDAO.findAll().size();

        assertEquals(countBefore + 1, countAfter);
    }
}

データの保存と読み取りの間でわかるように、デフォルトFushModeではAUTODB に実際にデータを保存できないため、セッションをフラッシュする必要があります。

質問:呼び出しの繰り返しを避けるためFlushModeALWAYS、セッション ファクトリまたは他の場所にどのように設定できますか?session.flush()

DAO のすべての DB 呼び出しは、HibernateTemplateインスタンスを使用します。

前もって感謝します。

4

3 に答える 3

1

以下を追加してみてください。

@Autowired
private SessionFactory sessionFactory;

@Before
public void myInitMethod(){
  sessionFactory.getCurrentSession().setFlushMode(FlushMode.ALWAYS);
}
于 2010-11-19T21:07:45.940 に答える
0

これで十分です。

@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SimpleIntegrationTest extends AbstractTransactionalJUnit4SpringContextTests {

    @Autowired(required = true)
    private DummyDAO dummyDAO;

    @Test
    public void testPersistTestEntity() {
        assertEquals(0, dummyDAO.findAll().size());
        dummyDAO.makePersistent(new DummyEntity());
        assertEquals(1, dummyDAO.findAll().size());
    }
}

applicationContext.xmlから

<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory"/>
    </property>
</bean>

このシナリオでトランザクションがどのように機能するかについて質問がある場合は、 TransactionalTestExecutionListenerのソースを表示してください。

AOP(アスペクト指向プログラミング)を使用してトランザクションをプロキシすることもできます。

于 2010-10-29T04:45:51.410 に答える
0

hibernate object flushingによると、フラッシュはデフォルトで次の時点で発生します。

  • 一部のクエリ実行前
  • org.hibernate.Transaction.commit() から
  • Session.flush() から

したがって、dummyDAO.findAll().size();呼び出される前に、セッション内のオブジェクトはすでに db にフラッシュされています。FlushMode を ALWAYS に設定する必要はありません。

于 2013-01-31T06:46:28.903 に答える