2015-07-10 66 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,但都没有工作)。