2016-01-08 84 views
0

我已經通過Stackoverflow搜索找到我的問題的答案,發現一些非常類似的問題,但沒有答案。Glassfish嵌入式不能部署EJB模塊

我在做什麼: 創建一個簡單的junit測試,其中啓動了Glassfish 4.1嵌入式容器,並測試了一個簡單的EJB操作。

樣品EJB:

@Stateless 
@LocalBean 
public class ExampleBean { 

    public int meaningOfLife() { 
     return 42; 
    } 
} 

很簡單。 這裏是我的單元測試:

public class BasicTest { 
    @EJB 
    private ExampleBean examplebean; 

    private static Context context; 

    private static EJBContainer container; 

    @BeforeClass 
    public static void init() { 

     Map<String,Object> props = new HashMap<String,Object>(); 
     //props.put(EJBContainer.MODULES, new File("target/classes")); 
     props.put(EJBContainer.MODULES, new File("D:\\Development\\IDE\\workspace-templates\\jee7-template\\template-service\\target")); 

     try { 
      container = EJBContainer.createEJBContainer(props);//.getContext().bind("inject", this); 
      context = container.getContext(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

我的pom.xml依賴關係:

<dependency> 
     <groupId>org.glassfish.main.extras</groupId> 
     <artifactId>glassfish-embedded-static-shell</artifactId> 
     <version>4.1</version> 
     <scope>system</scope> 
     <systemPath>D:\\Development\\Servers\\glassfish4.1-activiti\\glassfish\\lib\\embedded\\glassfish-embedded-static-shell.jar</systemPath> 
    </dependency> 

我也試圖與添加以下的依賴:

<dependency> 
     <groupId>org.glassfish.main.ejb</groupId> 
     <artifactId>ejb-container</artifactId> 
     <version>4.1</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>javax.ejb</groupId> 
     <artifactId>javax.ejb-api</artifactId> 
     <version>3.2</version> 
     <scope>test</scope> 
    </dependency> 

而且結果: 的嵌入式GF 4.1容器無法加載該簡單EJB(在maven編譯之後,它存在於target/classes文件夾中)。

我得到以下的錯誤,基於所述不同的代碼的變化(如使用特性傳遞給容器或不):

GF 4.1 Embedded UnsatisfiedDependencyException

GF 4.1 Embedded Can't deploy

GF 4.1 Embedded Can't deploy EJB classes

的代碼我粘貼了最後一條錯誤信息。

我不明白。到處尋找信息,說這應該工作。另外,如果我嘗試使用OpenEJB容器(不幸的是它只是jee6),它可以正常工作。

<dependency> 
    <groupId>org.apache.openejb</groupId> 
    <artifactId>openejb-core</artifactId> 
    <version>4.7.3</version> 
    <scope>test</scope> 
    </dependency> 
    <dependency> 
    <groupId>org.apache.openejb</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>6.0-6</version> 
    <scope>test</scope> 
    </dependency> 

感謝您的幫助!

+0

奇怪的事情,我從IntelliJ IDEA的運行相同的測試(第一次當得到一個稍微不同的輸出運行是從日食)。 查看輸出:http://pastebin.com/DBxwRjCm – csabee

回答

0

想必不太回答這個問題,但一些更普遍的想法,單元測試的EJB:

單元測試的名字說,應該只測試單元本身,僅此而已。由於EJB 3.x bean是POJO,因此只需編寫普通的JUnit測試而不需要(嵌入式)容器。關於其他bean的引用,請使用像Mockito這樣的框架來嘲笑它們。

在進行集成測試時,您希望多個EJB進行交互,可能需要與數據庫協作,然後您需要容器有依賴注入。您可以在這裏使用嵌入式容器,但您也可以使用像Arquillian這樣的框架,因爲您可以使用真實的容器。

+0

正如你所看到的,我從一個非常簡單的測試開始。我們不使用arquillian,因爲它錯過了我們需要的功能。我還發現mockito沒用。所以請儘量有幫助,我想解決我的問題,爲什麼嵌入式容器失敗。 – csabee

+0

另外:對於產品開發,我們希望使用應用服務器的嵌入式外殼,因此單元測試是一個很好的起點。 – csabee

+0

@csabee好吧,正如我所說的那樣,這有點偏離主題,但我確實試圖有所幫助。因爲許多人試圖在單元測試中使用更多,例如應該是嵌入式容器,而不是使用專爲此設計的模擬。 –

0

我想我已經找到了解決我的問題(目前似乎工作,但我不知道,如果這是真正的問題)。

依賴更正:

<dependency> 
    <groupId>javax</groupId> 
    <artifactId>javaee-api</artifactId> 
    <version>7.0</version> 
    <scope>provided</scope> 
</dependency> 

<dependency> 
    <groupId>junit</groupId> 
    <artifactId>junit</artifactId> 
    <version>4.12</version> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.main.common</groupId> 
    <artifactId>simple-glassfish-api</artifactId> 
    <version>4.1</version> 
    <scope>test</scope> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.main.extras</groupId> 
    <artifactId>glassfish-embedded-static-shell</artifactId> 
    <version>4.1</version> 
    <scope>system</scope> 
    <systemPath>D:\\Development\\Servers\\glassfish4.1-activiti\\glassfish\\lib\\embedded\\glassfish-embedded-static-shell.jar</systemPath> 
</dependency> 

那麼,什麼是真正缺少的是org.glassfish.main.common /簡單與GlassFish API JAR(不知道爲什麼,這是解決我的問題)。

這裏是固定碼:

public class BasicTest { 
@EJB 
private ExampleBean examplebean; 
private Context context; 
private EJBContainer container; 

@Before 
public void init(){ 
    try { 
     container = EJBContainer.createEJBContainer(); 
     context = container.getContext(); 
     context.bind("inject", this); 
    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

@Test 
public void testmeaning() throws NamingException{ 
    if(examplebean == null){ 
     examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean"); 
    } 

    assertEquals(42, examplebean.meaningOfLife()); 
} 
} 

或者使用靜態成員@BeforeClass

public class BasicTest { 

@EJB 
private ExampleBean examplebean; 
private static Context context; 
private static EJBContainer container; 

@BeforeClass 
public static void init() { 
    container = EJBContainer.createEJBContainer(); 
    context = container.getContext(); 
} 

@Test 
public void testmeaning() throws NamingException { 
    if (examplebean == null) { 
     examplebean = (ExampleBean) context.lookup("java:global/classes/ExampleBean"); 
    } 
    assertEquals(42, examplebean.meaningOfLife()); 
} 

}