容器内 JUnit 测试中的 CDI SessionScoped POJO
CDI SessionScoped POJO inside an in-container JUnit test
我正在使用 JUnit 测试 Web 应用程序。这个应用程序的业务层是用 EJB stateless classes 编写的。
所以我用 JUnit 和 Glassfish-embedded 做了 "in container" 测试。
到目前为止一切正常,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 被注入到静态 class 中。像这样:
public class MyStaticClass {
public static boolean verifyLogin(String login) {
MySessionPojo mySessionPojo = CDI.current().select(MySessionPojo.class).get();
return mySessionPojo.getLogin().equals(login);
}
}
此静态 class 在 EJB 中用于保护业务代码,如下所示:
@Stateless
public class MyEJB {
public void doSomething(String login) {
if(MyStaticClass.verifyLogin(login)){
//do something
}
}
}
在普通的 Glassfish 4.1 服务器中,静态 class 中的 POJO 注入工作正常。
在嵌入 Glassfish 的内部,POJO 注入失败并显示以下消息:
WELD-001303: No active contexts for scope type javax.enterprise.context.SessionScoped
我认为这是因为没有绑定到它的 Http 会话。
有没有办法以编程方式 simulate/create à SessionContext?
谢谢。
好的,我终于找到了解决方法。我使用框架 JMockit 将静态 class 替换为模拟 class,使用始终 return TRUE 的假方法。 (我已经测试了 Mockito 和 PowerMock,但都没有用)。
我正在使用 JUnit 测试 Web 应用程序。这个应用程序的业务层是用 EJB stateless classes 编写的。 所以我用 JUnit 和 Glassfish-embedded 做了 "in container" 测试。 到目前为止一切正常,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 被注入到静态 class 中。像这样:
public class MyStaticClass {
public static boolean verifyLogin(String login) {
MySessionPojo mySessionPojo = CDI.current().select(MySessionPojo.class).get();
return mySessionPojo.getLogin().equals(login);
}
}
此静态 class 在 EJB 中用于保护业务代码,如下所示:
@Stateless
public class MyEJB {
public void doSomething(String login) {
if(MyStaticClass.verifyLogin(login)){
//do something
}
}
}
在普通的 Glassfish 4.1 服务器中,静态 class 中的 POJO 注入工作正常。 在嵌入 Glassfish 的内部,POJO 注入失败并显示以下消息:
WELD-001303: No active contexts for scope type javax.enterprise.context.SessionScoped
我认为这是因为没有绑定到它的 Http 会话。 有没有办法以编程方式 simulate/create à SessionContext?
谢谢。
好的,我终于找到了解决方法。我使用框架 JMockit 将静态 class 替换为模拟 class,使用始终 return TRUE 的假方法。 (我已经测试了 Mockito 和 PowerMock,但都没有用)。