4

我正在通过 maven 运行 JUnit 测试,其中正在测试一个 struts 操作 java 方法,该方法进行以下调用:

// Gets this from the "org.apache.struts2.util.TokenHelper" class in the struts2-core jar
String token = TokenHelper.getTokenName();

这是“TokenHelper.java”中的方法:

/**
 * Gets the token name from the Parameters in the ServletActionContext
 *
 * @return the token name found in the params, or null if it could not be found
 */
public static String getTokenName() {

    Map params = ActionContext.getContext().getParameters();

    if (!params.containsKey(TOKEN_NAME_FIELD)) {
        LOG.warn("Could not find token name in params.");

        return null;
    }

    String[] tokenNames = (String[]) params.get(TOKEN_NAME_FIELD);
    String tokenName;

    if ((tokenNames == null) || (tokenNames.length < 1)) {
       LOG.warn("Got a null or empty token name.");

        return null;
    }

    tokenName = tokenNames[0];

    return tokenName;
}

此方法的第一行是返回null

Map params = ActionContext.getContext().getParameters();

下一个 LOC,“params.containKey(...)”抛出 NullPointerException,因为“params”为空。

当这个动作被正常调用时,它运行良好。但是,在 JUnit 测试期间,会出现此空指针。

我的测试类如下所示:

@Anonymous
public class MNManageLocationActionTest extends StrutsJUnit4TestCase {

    private static MNManageLocationAction action;

    @BeforeClass
    public static void init() {
        action = new MNManageLocationAction();
    }

    @Test
    public void testGetActionMapping() {
        ActionMapping mapping = getActionMapping("/companylocation/FetchCountyListByZip.action");
        assertNotNull(mapping);
    }

    @Test
    public void testLoadStateList() throws JSONException {
        request.setParameter("Ryan", "Ryan");

        String result = action.loadStateList();

        assertEquals("Verify that the loadStateList() function completes without Exceptions.", 
              result, "success");
    }
}

在我切换到使用 StrutsJUnit4TestCase 之后,ActionContext.getContext() 至少不再为空。

知道为什么 .getParameters() 返回 null 吗?

4

1 回答 1

2

您需要在测试方法中自己初始化参数映射。此外,如果要获取令牌名称,则需要将其放入参数映射中。

Map<String, Object> params = new HashMap<String, Object>();
params.put(TokenHelper.TOKEN_NAME_FIELD, 
                       new String[] { TokenHelper.DEFAULT_TOKEN_NAME });
ActionContext.getContext().setParameters(params);
于 2014-01-22T19:39:10.373 回答