不能使Servlet的行为取决于POST请求参数的存在

时间:2018-11-09 23:55:53

标签: html post servlets junit

我在servlet的doPost()中拥有这个:

if(request.getParameter("mode").equals("html"))
    request.getRequestDispatcher("WEB-INF/jsp/Menu.jsp").forward(request, response);
else {
    request.getRequestDispatcher("WEB-INF/jsp/success.jsp").forward(request, response);
}

我通过具有如下形式的HTML页面来测试第一条语句的执行:

<form action="" method="post">
    Username:<br>
    <input type="text" name="user"><br>
    Password:<br>
    <input type="text" name="pass"><br><br>
    <input type="hidden" name="mode" value="html" />
    <input type="submit" value="Submit">
</form>

提交表单时,第一个语句(转发到Menu.jsp)正确执行。 我通过进行单元测试(不是我自己写的)来测试第二条语句的执行,该单元测试直接而不是通过表单来发出发布请求,如下所示:

@Test
public void testLoginSuccess() {
    try {
        WebClient webClient = new WebClient();
        String jsonText = login(webClient, "bob3", "fred3");
        DocumentContext dc = JsonPath.parse(jsonText);
        Assert.assertEquals("success", dc.read("$['status']"));


    } catch (IOException e) {
        e.printStackTrace();
        Assert.assertTrue(false);
    }
}

登录方法:

private String login(WebClient webClient, String username, String password)
            throws MalformedURLException, IOException {
    WebRequest requestSettings = new WebRequest(new URL(URL_BASE+"Login"), HttpMethod.POST);
    requestSettings.setRequestParameters(new ArrayList());
    requestSettings.getRequestParameters().add(new NameValuePair("user", username));
    requestSettings.getRequestParameters().add(new NameValuePair("pass", password));

    Page page = webClient.getPage(requestSettings);
    String jsonText = page.getWebResponse().getContentAsString();
    testLogger.log(Level.INFO, jsonText);
    return jsonText;
}

测试失败,并在登录方法中的这一行给了我FailingHttpStatusCodeException:

Page page = webClient.getPage(requestSettings);

由于我不是自己编写测试并且也不完全理解测试代码,所以我无法说出测试为什么失败,但是当我的servlet中没有if-else时,它就过去了,总是执行else语句。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不好,我在做

request.getParameter("mode").equals("html")

如果未设置参数,则“ request.getParameter(“ mode”)“可能返回null,然后对null结果调用.equals。

为什么它在堆栈跟踪中没有给我NullPointerException?