【问题标题】:CDI SessionScoped POJO inside an in-container JUnit test容器内 JUnit 测试中的 CDI SessionScoped POJO
【发布时间】:2015-07-10 15:48:50
【问题描述】:

我正在使用 JUnit 测试一个 Web 应用程序。此应用程序的业务层是用 EJB 无状态类编写的。 所以我使用 JUnit 和 Glassfish 嵌入式进行“容器内”测试。 到目前为止一切正常,EJB 是使用查找函数注入的。 这是一个简单的测试用例:

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-embedded 中,POJO 注入失败并显示以下消息:

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

我认为这是因为它没有绑定 Http Session。 有没有办法以编程方式模拟/创建 à SessionContext?

谢谢。

【问题讨论】:

    标签: session junit glassfish ejb cdi


    【解决方案1】:

    好的,我终于找到了解决方法。我使用框架 JMockit 将静态类替换为模拟类,并使用始终返回 TRUE 的假方法。 (我已经测试过 Mockito 和 PowerMock,但都没有工作)。

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 2023-03-07
      • 1970-01-01
      • 2013-06-06
      • 2013-03-09
      • 2012-08-03
      • 2019-01-04
      • 2014-02-28
      • 1970-01-01
      相关资源
      最近更新 更多