2011-09-27 33 views
1

當每次測試獨立執行時,我已設法使用備用描述符與在OpenEJB上運行的單元測試一起工作,使用依賴EJB組件的存根。但是一旦我引入了一個測試套件,看起來部署描述符是從添加到套件的第一個測試中獲得的。使用jUnit測試套件時,OpenEJB備用描述符無法正常工作

一些代碼更好地解釋它。被測豆類像

@Stateless 
@Local(A.class) 
public class ABean implements A { 
    // Bean implementation, no dependencies 
} 


@Stateless 
@Local(B.class) 
public class BBean implements B { 

    @EJB 
    A aBean; // Dependency to ABean 

    // Rest of the implementation 
} 

和測試用例的B(測試用例對於A類似,只是它不設置該屬性使用備用描述符)

public class BBeanTest { 
    private B bean; 

    @Before 
    public void bootContainer() throws Exception { 
     Properties props = new Properties(); 
     props.put(Context.INITIAL_CONTEXT_FACTORY, 
       "org.apache.openejb.client.LocalInitialContextFactory"); 
     props.put("openejb.altdd.prefix", "test"); // Use stubs 

     System.out.println("boot B: " + props); 

     context = new InitialContext(props); 
     bean = (B) context.lookup("BBeanLocal"); 
    } 
} 

正如所說,這一切工作當單獨執行時很好。備用描述符注入A接口的存根實現。

使用以下測試套件時,事情開始崩潰。

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    ABeanTest.class, 
    BBeanTest.class 
}) 
public class MySuite { 
     // Empty on purpose, annotations do the trick 
} 

運行此套件時,測試B的備用描述符未被使用。雖然,輸出表明至少該屬性的每個測試

boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory} 
boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory} 
boot A: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory} 
boot B: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory, openejb.altdd.prefix=test} 
boot B: {java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory, openejb.altdd.prefix=test} 

之前如果我扭轉加載試驗套件的順序設置,即前ABeanTest.class添加BBeanTest.class,它會使用備用描述符。由於ABean沒有依賴關係,在這種情況下,這可以很好地工作,但可能會導致使用多個備用描述符進行更大設置時出現問題。

任何指針?

在此先感謝。

編輯根據日誌輸出,容器實際上僅在第一次測試中啓動一次,因爲它大約需要一次。 2,5秒執行,而其他人需要大約0,001秒。

EDIT2 OpenEJB的版本是的Apache OpenEJB的3.1.4版本:20101112-03:32

+0

設法做什麼,我需要batchtest的JUnit Ant任務的幫助。在可以通過包名來區分'套件'的情況下很好地工作。它仍然需要知道是否可以在OpenEJB中使用jUnit TestSuite,以便在需要時創建更復雜的套件。 – kaskelotti

回答

1

基於日誌輸出,該容器實際上是用於第一測試引導只有一次,因爲它需要約。 2,5秒執行,而其他人需要大約0,001秒。

正如你正確地注意到的那樣,初始化只發生一次。


@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    ABeanTest.class, 
    BBeanTest.class 
}) 

因此,在這種情況下,兩個ABeanTest和BBeanTest同一容器實例中跑出,具有相同的初始上下文屬性如通過ABeanTest設置。

在你的情況,因爲你需要兩個測試類的不同設置,我認爲在ABeanTest @AfterClass中傾倒容器實例並在BBeanTest中使用新實例應該這樣做。

This blog post表明我是多麼

+0

謝謝@stratwine。您明確鏈接的博客文章解釋瞭如何在測試之間關閉容器。簡單地調用Context#close()是不夠的。一旦創建了一個屬性「openejb.embedded.initialcontext.close」,它還需要將值「destroy」傳遞給InitialContext。 – kaskelotti

相關問題