Java Servlet中当前的TDD方法是否可以优化?
当前的方法是在ServletTest中创建HTML,运行测试,更改Servlet,直到测试变为绿色。但是,感觉Servlet中TDD的这种方法比TDD普通Java类更迂回、更耗时,因为在ServletTest中创建的HTML大部分被复制到Servlet中,随后就格式进行了更改(例如,删除反斜杠)而不是在普通Java类的测试中测试输出,并在main中编写大部分代码 服务测试: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
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>");
}