2012-01-03 55 views
5

如何單元測試ProcessorBean? 由於我只想測試ProcessorBean而不是Dao,所以我需要對Dao進行存根或模擬,但我不知道如何使用Junit來做到這一點。單元測試一個ejb3.0有另一個ejb注入

我使用Junit4和EJB3.0

@Stateless 
public class ProcessorBean { 

    @EJB 
    private Dao dao; 

    public void process() { 
     //logic to be tested 
    } 
} 

回答

3

Series of Effective Mockito articles有在OpenEJB的一些支持,你可能會發現與嘲弄的組合使用。

作爲EJB 3.0 Embedded EJBContainer API的替代方案,您可以簡單地在代碼中構建應用程序。

import junit.framework.TestCase; 
import org.apache.openejb.jee.EjbJar; 
import org.apache.openejb.jee.StatelessBean; 
import org.apache.openejb.junit.ApplicationComposer; 
import org.apache.openejb.junit.Module; 
import org.junit.Test; 
import org.junit.runner.RunWith; 

import javax.ejb.EJB; 

@RunWith(ApplicationComposer.class) 
public class ProcessorBeanTest extends TestCase { 

    @EJB 
    private ProcessorBean processorBean; 

    @Module 
    public EjbJar beans() { 
     EjbJar ejbJar = new EjbJar(); 
     ejbJar.addEnterpriseBean(new StatelessBean(ProcessorBean.class)); 
     ejbJar.addEnterpriseBean(new StatelessBean(MockDao.class)); 
     return ejbJar; 
    } 

    @Test 
    public void test() throws Exception { 

     // use your processorBean 

    } 
} 

這裏我們看到一個由ApplicationComposer運行的測試用例。它是JUnit測試運行器的簡單包裝,它可以查找可用於定義應用程序的@Module方法。

這實際上是OpenEJB多年來做了所有內部測試的結果,也是我們決定在前幾個版本(自3.1.3開始)之後開放的內容。它超越了功能強大且速度極快的特性,因爲它可以省去類路徑掃描和一些較重的部署。

Maven的依賴性看起來可能是這樣:

<dependencies> 
    <dependency> 
     <groupId>org.apache.openejb</groupId> 
     <artifactId>javaee-api</artifactId> 
     <version>6.0-3-SNAPSHOT</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- 
    The <scope>test</scope> guarantees that none of your runtime 
    code is dependent on any OpenEJB classes. 
    --> 
    <dependency> 
     <groupId>org.apache.openejb</groupId> 
     <artifactId>openejb-core</artifactId> 
     <version>4.0.0-beta-1</version> 
     <scope>test</scope> 
    </dependency> 

    </dependencies> 
+0

非常有趣的功能。不知道*關於Open EJB的信息 - 感謝分享! – 2012-01-03 23:06:54

+0

@David Blevins在這種情況下,MockDao.class是一個開發者實現的DAO的假嗎? – Bala 2012-01-11 12:13:58

+0

@Bala確實如此。因此,從理論上講,MockDao可以拋出一個異常來僞造一個持久性失敗或其他東西,或者硬連接返回一個特定的實體等。靜態內部類可以正常工作,所以MockDao可以在測試用例中正確定義。大多數在OpenEJB中的單元測試都傾向於有一堆靜態的內部類「測試」bean。測試豆(aka mock beans)往往很小,很高興將它們放在一起。 – 2012-01-11 17:05:52

1

如果你想嘲笑任何物體或創建它的存根,您可以使用額外的庫,例如Mockito。它可以讓你輕鬆地模擬任何課程或甚至是一個界面。

補充閱讀: