StrutsSpringTestCase - 几个上下文 - 如何按顺序实例化它们

时间:2014-10-31 15:12:43

标签: java spring junit struts2 actioncontext

我正在为使用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.xmlbeans.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:看起来,这里有几种情境:applicationContextActionContext ServletContextServletActionContext

当我的测试类扩展StrutsSpringTestCase类时,我猜applicationContext已初始化。但我不确定其他情况。在哪里初始化它们?

修改

源代码中的进一步调查揭示了一个问题.. 当我致电ServletActionContext.getActionMapping()时,在其内部调用ActionContext get()方法。

public Object get(String key) {
    return context.get(key);
}

context是对象的映射,在其中查找不存在的键struts.actionMapping的值。所以,返回null。但不确定为什么会这样。它不是空的。它有其他键/值。

1 个答案:

答案 0 :(得分:0)

你的问题的答案:

ServletActionContext.getActionMapping()会返回动作上下文中的映射,如果未设置,则会获得null

您不应手动设置会话,执行操作时会创建会话。

不要搞乱不同的课程ActionContextServletContextServletActionContext。你不应该对初始化这些对象做任何事情,因为它是由超类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);
}