我正在为使用JUnit使用Struts2,Spring,Hibernate的项目编写集成测试用例。
我的测试类扩展了StrutsSpringTestCase
。应用程序需要登录/会话来调用任何操作。以下是代码:
@Test
public void testGetActionProxy() throws Exception {
ActionProxy proxy;
String result;
ActionContext.getContext().setSession(createUserSession()); // Not sure if this is needed here. But in order to get the session working, I need this.
proxy = initAction("cInfo");
assertNotNull(proxy);
CustInfo action = (CustInfo) proxy.getAction();
result = proxy.execute();
assertEquals(Action.SUCCESS, result);
}
initAction()
方法:
private ActionProxy initAction(String actionUri) {
ActionProxy proxy = getActionProxy(actionUri);
ActionContext.setContext(proxy.getInvocation().getInvocationContext()); // I tried this line of code to get the ServletActionContext.getMapping().getName() to work. But no use.
ActionContext actionContext = proxy.getInvocation().getInvocationContext();
actionContext.setSession(createUserSession()); // This is for setting a session
return proxy;
}
在它遇到此方法之前,它会加载所有配置文件。 struts.xml
jpaContext.xml
,beans.xml
等
我的操作类CustInfo
实现了ServletRequestAware
,并且它有一个方法getActionName
,其中包含以下行:
return ServletActionContext.getActionMapping().getName();
当我呼叫result = proxy.execute();
时会调用此方法。所以请求失败了。
问题1:为什么返回null
?我以为ServletActionContext
是自动启动的,所以它应该返回一个值。但事实并非如此。如果没有初始化,初始化的适当位置在哪里以及如何?
我在getActionProxy
电话后尝试了以下内容。但它仍然没有用。
ServletActionContext.setContext(proxy.getInvocation().getInvocationContext());
问题2:要在getActionProxy()
之前设置会话,我必须致电,
ActionContext.getContext().setSession(createUserSession());
再次,在getActionProxy
之后
ActionContext actionContext = proxy.getInvocation().getInvocationContext();
actionContext.setSession(createUserSession());
设置会话。我想,这里有问题。
问题3:看起来,这里有几种情境:applicationContext
,ActionContext
ServletContext
和ServletActionContext
。
当我的测试类扩展StrutsSpringTestCase
类时,我猜applicationContext
已初始化。但我不确定其他情况。在哪里初始化它们?
修改
源代码中的进一步调查揭示了一个问题..
当我致电ServletActionContext.getActionMapping()
时,在其内部调用ActionContext
get()
方法。
public Object get(String key) {
return context.get(key);
}
context
是对象的映射,在其中查找不存在的键struts.actionMapping
的值。所以,返回null
。但不确定为什么会这样。它不是空的。它有其他键/值。
答案 0 :(得分:0)
你的问题的答案:
ServletActionContext.getActionMapping()
会返回动作上下文中的映射,如果未设置,则会获得null
。
您不应手动设置会话,执行操作时会创建会话。
不要搞乱不同的课程ActionContext
,ServletContext
和ServletActionContext
。你不应该对初始化这些对象做任何事情,因为它是由超类StrutsSpringTestCase
完成的。
public void testGetActionMapping() {
ActionMapping mapping = getActionMapping("/cInfo.action");
assertNotNull(mapping);
assertEquals("/", mapping.getNamespace());
assertEquals("cInfo", mapping.getName());
}
public void testGetActionProxy() throws Exception {
ActionProxy proxy = getActionProxy("/cInfo.action");
assertNotNull(proxy);
CustInfo action = (CustInfo) proxy.getAction();
assertNotNull(action);
String result = proxy.execute();
assertEquals(Action.SUCCESS, result);
}