2010-10-28 12 views
6

Bütünleştirme testleri yazıyorum ve bir test yönteminde DB'ye veri yazmak ve daha sonra okumak istiyorum. Eğer depolama ve veri okuma arasında görebileceğiniz gibi varsayılan FushMode böylece hiçbir veri aslında DB saklanabilir AUTO çünküHazırda bekletme modunun Spring modunda ayarını yaptırma

@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); 
    } 
} 

, oturum yıkanmalıdır.

Soru: Can Bazı nasıl session.flush() çağrıyı tekrarlamaktan kaçınmak için oturum fabrikasında ALWAYS için FlushMode veya başka bir yere kurdu?

DAO'daki tüm DB çağrıları HibernateTemplate örneğiyle gider.

Şimdiden teşekkürler.

+1

Spring, "SessionFactory" öğesini sınamaya enjekte edebilir ve 'setUp' içinde geçerli' Session'ı alabilir ve 'setFlushMode()' öğesini çağırabilir misiniz? –

cevap

0

Bu yeterli olmalıdır:

@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()); 
    } 
} 

TransactionalTestExecutionListener kaynağı görüntüle

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

applicationContext.xml

itibaren işlemler bu senaryoda nasıl çalıştığı hakkında sorularınız varsa.

Ayrıca, AOP (aspect oriented programming) proxy işlemlerini de kullanabilirsiniz.

+0

Üzgünüm, ne için yeterli? Bu durumun, nesneyi depoladıktan sonra hazırda bekleme oturumunun temizlenmesine neden olan sorunu çözemediğini anlayamıyorum. – glaz666

+0

İşlemle ilgili açıklamayı eklerken, hiçbir işlem yapılmıyor. TransactionalTestExecutionListener sınıfına bir göz atın. İşlemleri açan bir BeforeTestMethod ve kapatılan/geri verilen bir AfterTestMethod var. – hisdrewness

+0

TransactionalTestExecutionListener sınıfına bir göz attım. Ve belgelerin açık bir şekilde ifade ettiği gibi, [Transactional] ile açıklanmış olan sınıflar, metot yürütme işlemi boyunca işlemi başlatacak ve bitirecektir ve eğer sınıf ayrıca @TransactionConfiguration ile açıklamalıysa, geri alınacaktır. Sözü ettiğin yöntemler, "... bir işlemin dışında bir kod kurmak ya da kurmak için". Yani sanırım, işlem aslında gerektiği gibi ele alındı – glaz666

1

deneyin ekleyerek aşağıdaki:

@Autowired 
private SessionFactory sessionFactory; 

@Before 
public void myInitMethod(){ 
    sessionFactory.getCurrentSession().setFlushMode(FlushMode.ALWAYS); 
} 
1

göre hibernate object flushing için, ateş basması şu noktalarda varsayılan olarak oluşur: org.hibernate.Transaction.commit bazı sorgu infaz

  • önce

    • ()
    • Session.flush()

    Bu nedenle, dummyDAO.findAll().size(); öncesinde, oturumdaki nesneler zaten db'de temizlendi. FlushMode'u DAİMA olarak ayarlamak gerekli değildir.

  • İlgili konular