2015-07-10 48 views
0

我正在使用JUnit測試一個Web應用程序。此應用程序的buisness層是在EJB無狀態類中編寫的。 因此,我使用JUnit和Glassfish嵌入來進行「容器」測試。 到目前爲止,所有工作都很好,EJB使用查找函數注入。 下面是一個簡單的測試情況:CDI SessionScoped在容器內JUnit測試中的POJO

public class SupportTest { 

private static EJBContainer container; 

private static MyEJB myEjb; 

@BeforeClass 
public static void setUpServices() throws NamingException { 
    Map<String, Object> properties = new HashMap<String, Object>(); 
    properties.put(EJBContainer.MODULES, new File("target/classes")); 
    container = EJBContainer.createEJBContainer(properties); 
    myEjb = (MyEJB) container.getContext().lookup("java:global/classes/MyEJB"); 
} 

@Test 
public void test() { 
    myEjb.doSomething("user_login"); 
} 

} 

現在我有一個SessionScoped POJO(CDI),該保持的信息,如用戶登錄等。 這個Pojo是在靜態類中注入的。就像這樣:

public class MyStaticClass { 

public static boolean verifyLogin(String login) { 
    MySessionPojo mySessionPojo = CDI.current().select(MySessionPojo.class).get(); 
    return mySessionPojo.getLogin().equals(login); 
} 

}

這個靜態類在EJB用於保護樓內設有商務代碼,就像這樣:

@Stateless 
public class MyEJB { 

public void doSomething(String login) { 
    if(MyStaticClass.verifyLogin(login)){ 
     //do something 
    } 
} 
} 

內部正常的Glassfish的4.1服務器,該POJO的注入在靜態類內工作正常。 裏面的嵌入式Glassfish的,該POJO注入失敗,此消息:

WELD-001303: No active contexts for scope type javax.enterprise.context.SessionScoped 

我想這是因爲沒有HTTP會話綁定到它。 有沒有辦法以編程方式模擬/創建àSessionContext?

謝謝。

回答

0

好吧,我終於找到了解決方法。我使用框架JMockit通過模擬類來替換靜態類,其中總是返回TRUE的僞方法。 (我已經測試過Mockito和PowerMock,但都沒有工作)。