2012-01-30 79 views
1

運行測試時,它在調用method()時掛起。難道我做錯了什麼?幫幫我!在JUnit中測試REQUIRES_NEW

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"beans.xml"}) 
@Transactional(rollbackFor = Exception.class) 
public class Test { 
    @Test 
    public void test() { 
     itemUnderTestDao.method(); 
     // ... 
    } 
} 

public class ItemUnderTestDao { 
    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public void method() { 
     // ... 
    } 
} 

忘記上面的代碼。我現在已經在http://www44.zippyshare.com/v/46865082/file.html上傳了一個Eclipse項目(不包括像spring這樣的依賴項)。所有關於如何通過測試的信息都非常感謝!測試通過,如果我有兩個sqlite數據庫和兩個數據源...

+0

你執行訪問數據庫中的測試任何其他代碼? – axtavt 2012-01-30 11:36:20

+0

不,我不... – aandeers 2012-01-30 11:40:54

回答

0

正如mrembisz所說的,你正試圖在同一時間/線程獲得2個連接。

  1. 對於測試本身,這將存在用於測試
  2. 的持續時間對於方法調用,這將存在用於呼叫的持續時間。

我在一些不同的情況下遇到了同樣的事情。

2種方法可以解決這個問題:

  1. 更改傳播到REQUIRED,這樣你會重用連接該測試最初獲得的。
  2. 增加池的大小,但請記住,你需要考慮simultanious更新的最大數量,大致maxThreadPoolSize >= (maxSimultaniousUpdates + 1) + (min size for other activities)(如果你有列表1掛起的連接,最終所有等待的操作將完成)。 Othrewise這將重新出現在生產中。

首先解決對我來說更好的着,當然,如果它不傷害你的邏輯:)

0

您試圖打開數據庫的第二個連接。第一個因@Transactional類別Test,REQUIRES_NEWmethod()強制另一個連接而打開。

可能您的連接池只允許一個併發連接。檢查其大小和數據庫配置。

同時運行您的問題並將所選答案標記爲已接受(答案主體旁邊的複選標記形狀)。

+0

' ... ' – aandeers 2012-01-30 12:17:51

+0

@AndersOlofsson在<'。 – mrembisz 2012-01-30 12:19:39

+0

我已經試過了,它不會改變任何東西。這很奇怪...... – aandeers 2012-01-30 12:24:56