Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Servlet中当前的TDD方法是否可以优化?_Java_Html_Servlets_Tdd_Java 8 - Fatal编程技术网

Java Servlet中当前的TDD方法是否可以优化?

Java Servlet中当前的TDD方法是否可以优化?,java,html,servlets,tdd,java-8,Java,Html,Servlets,Tdd,Java 8,当前的方法是在ServletTest中创建HTML,运行测试,更改Servlet,直到测试变为绿色。但是,感觉Servlet中TDD的这种方法比TDD普通Java类更迂回、更耗时,因为在ServletTest中创建的HTML大部分被复制到Servlet中,随后就格式进行了更改(例如,删除反斜杠)而不是在普通Java类的测试中测试输出,并在main中编写大部分代码 服务测试: HttpServletRequest mockedHttpServletRequest=mock(HttpServletR

当前的方法是在ServletTest中创建HTML,运行测试,更改Servlet,直到测试变为绿色。但是,感觉Servlet中TDD的这种方法比TDD普通Java类更迂回、更耗时,因为在ServletTest中创建的HTML大部分被复制到Servlet中,随后就格式进行了更改(例如,删除反斜杠)而不是在普通Java类的测试中测试输出,并在main中编写大部分代码

服务测试:

HttpServletRequest mockedHttpServletRequest=mock(HttpServletRequest.class);
HttpServletResponse mockedHttpServletResponse=mock(HttpServletResponse.class);
HttpSession mockedHttpSession=mock(HttpSession.class);
StringWriter StringWriter=新StringWriter();
PrintWriter PrintWriter=新的PrintWriter(stringWriter);
私有最终字符串doGetHtmlStringPartOne=“”
+ "";
私有最终字符串doGetHtmlStringPart2=“”
+ ""
+ ""
+“+”\\n
+DoGetHTMLStringPart三+“\\n”+DoGetHTMLStringPart四;
}
public void mockDoGet()引发IOException、ServletException{
当(mockedHttpServletRequest.getSession())。然后返回(
模拟HttpSession);
when(mockedHttpServletResponse.getWriter())。然后返回(printWriter);
当(mockedHttpServletRequest.getParameter(“fractionBoolean”))
。然后返回(“真”);
当(mockedHttpServletRequest.getParameter(“randomDigitRange”))
。然后返回(“1”);
什么时候(
mockedHttpServletRequest
.getParameter(“randomMathematicalOperator”))
。然后返回(“1”);
当(mockedHttpServletRequest.getSession())。然后返回(
模拟HttpSession);
新ToBeDefinedServlet().doGet(mockedHttpServletRequest,
mockedHttpServletResponse);
}
Servlet:

protectedvoiddoget(HttpServletRequest),
HttpServletResponse响应)引发ServletException,IOException{
calculation.setFractionBoolean(Boolean.parseBoolean(请求
.getParameter(“fractionBoolean”);
calculation.setAssignment(Double.parseDouble(请求
.getParameter(“randomDigitRange”)、Double.parseDouble(请求
.getParameter(“randomMathematicalOperator”);
PrintWriter out=response.getWriter();
out.println(“”)
+ ""
+calculation.getAssignment()
+ ""
+ ""
+ ""
+ ""
+ "");
for(double-possibleAnswer:calculation.getPossibleAnswersArray()){
字符串possibleAnswerFormat=Boolean.parseBoolean(请求
.getParameter(“fractionBoolean”)==真
+新分数(可能的答案)+“”:“”+可能的答案
+ "";
out.println(“+possibleAnswerFormat+”);
}
out.println(“”)
+ ""
+ ""
+ "");
}

我认为这里的主要问题是,您通过手动将各种字符串中的html元素组合在一起来构建html页面。正如您所经历的,这会导致代码难以测试和维护


尝试使用JSF或一些simliar技术。这将使您能够只关注Java端的功能,而Java端的功能更易于测试。

我认为主要的问题是,您从一开始就以这种方式构建html页面。为什么不使用JSF或类似的技术呢?这是一个集成测试。您正在模拟浏览器。您的HTML应该使用一些模板引擎在模板中生成。此引擎将数据作为输入。您应该测试生成该数据的方法,而不是HTML。@Keppil我将遵循它来实现JSF。但是,
导入javax.faces无法解析
。我正在使用jdk8并试图解决这个问题,因为JSF回答了这个问题。感谢您的建议。JSF不是JavaSE的一部分。当然,您会遇到编译错误。导入正确的库后,它会工作
HttpServletRequest mockedHttpServletRequest = mock(HttpServletRequest.class);
HttpServletResponse mockedHttpServletResponse = mock(HttpServletResponse.class);
HttpSession mockedHttpSession = mock(HttpSession.class);

StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);

private final String doGetHtmlStringPartOne = "<html><body><table>"
        + "<tr><td><h1>";
private final String doGetHtmlStringPartTwo = "<\\/h1><\\/td>"
        + "<form method=\"post\">"
        + "<input type=\"hidden\" name=\"randomDigitRange\" value=\"1\" \\/>"
        + "<input type=\"hidden\" name=\"randomMathematicalOperator\""
        + " value=\"1\" \\/><input type=\"hidden\" name=\"fractionBoolean\""
        + " value=\"";

private final String doGetHtmlStringPartThree = "<td><input type=\"radio\" name=\"userInput\" value=\"(\\d)+.(\\d)+\">(\\d)+(\\s\\/\\s(\\d)+)?<\\/td>";

private final String doGetHtmlStringPartFour = "<\\/tr><tr><td>"
        + "<input type=\"submit\" value=\"Submit\" "
        + "onclick='this.form.action=\"ToBeDefinedServlet\";' \\/>"
        + "<\\/td><\\/tr><\\/table><\\/form><\\/body><\\/html>"
        + "<form action=\"\\/tobedefinedservlet\">"
        + "<input type=\"submit\" value=\"Home\"><\\/form>";

@Test
public void testBooleanFractionTrue() throws IOException, ServletException {
    mockDoGet();
    assertTrue(stringWriter.getBuffer().toString().trim().matches(expectedDoGetHtmlString("1 \\/ 1 \\+ 1 \\/ 1", true)));
}

public String expectedDoGetHtmlString(String assignment,
        Boolean fractionBoolean) {
    return doGetHtmlStringPartOne + assignment + doGetHtmlStringPartTwo
            + "" + fractionBoolean + "" + "\" \\/>" + "\\n"
            + doGetHtmlStringPartThree + "\\n" + doGetHtmlStringPartFour;
}

public void mockDoGet() throws IOException, ServletException {
    when(mockedHttpServletRequest.getSession()).thenReturn(
            mockedHttpSession);
    when(mockedHttpServletResponse.getWriter()).thenReturn(printWriter);
    when(mockedHttpServletRequest.getParameter("fractionBoolean"))
            .thenReturn("true");
    when(mockedHttpServletRequest.getParameter("randomDigitRange"))
            .thenReturn("1");
    when(
            mockedHttpServletRequest
                    .getParameter("randomMathematicalOperator"))
            .thenReturn("1");
    when(mockedHttpServletRequest.getSession()).thenReturn(
            mockedHttpSession);
    new ToBeDefinedServlet().doGet(mockedHttpServletRequest,
            mockedHttpServletResponse);
}
protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    calculation.setFractionBoolean(Boolean.parseBoolean(request
            .getParameter("fractionBoolean")));
    calculation.setAssignment(Double.parseDouble(request
            .getParameter("randomDigitRange")), Double.parseDouble(request
            .getParameter("randomMathematicalOperator")));
    PrintWriter out = response.getWriter();

    out.println("<html><body><table>"
            + "<tr><td><h1>"
            + calculation.getAssignment()
            + "</h1></td>"
            + "<form method=\"post\">"
            + "<input type=\"hidden\" name=\"randomDigitRange\" value=\""
            + request.getParameter("randomDigitRange")
            + "\" />"
            + "<input type=\"hidden\" name=\"randomMathematicalOperator\" value=\""
            + request.getParameter("randomMathematicalOperator") + "\" />"
            + "<input type=\"hidden\" name=\"fractionBoolean\" value=\""
            + request.getParameter("fractionBoolean") + "\" />");

    for (double possibleAnswer : calculation.getPossibleAnswersArray()) {
        String possibleAnswerFormat = Boolean.parseBoolean(request
                .getParameter("fractionBoolean")) == true ? ""
                + new Fraction(possibleAnswer) + "" : "" + possibleAnswer
                + "";

        out.println("<td><input type=\"radio\" name=\"userInput\" value=\""
                + possibleAnswer + "\">" + possibleAnswerFormat + "</td>");
    }

    out.println("</tr>"
            + "<tr><td><input type=\"submit\" value=\"Submit\" "
            + "onclick='this.form.action=\"ToBeDefinedServlet\";' /></td>"
            + "</tr></table></form></body></html>"
            + "<form action=\"/tobedefinedservlet\"><input type=\"submit\" value=\"Home\"></form>");
}