Servlet中当前的TDD方法是否可以优化? [英] Could current approach to TDD in Servlets be optimized?

查看:118
本文介绍了Servlet中当前的TDD方法是否可以优化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

目前的方法是在ServletTest中创建HTML,运行测试,更改Servlet直到测试变为绿色。然而,感觉这种在Servlet中使用TDD的方法比TDD普通的Java类迂回和耗时更多,因为在ServletTest中创建的HTML大部分被复制到Servlet中,并随后在格式上发生变化(例如,去掉反斜杠)而不是在普通Java类的测试中测试输出,并在大部分代码中写入。


$ b

ServletTest:

  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)+(\\\\\\\\\\\\\\\\\\\\\\\\\\\');
private final String doGetHtmlStringPartFour =< \\ / tr>< tr>< td>
+< input type = \submit\value = \ Submit \
+onclick ='this.form.action = \ToBeDefinedServlet\;'\\ />
+< \\ / TD>< \\ / TR>< \\ /表>< \\ /形式>< \\ /体>< \\ / 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 +赋值+ doGetHtmlStringPartTwo
++ fractionBoolean + +\\\ />+\\
+ doGetHtmlStringPartThree +\\\\
+ doGetHtmlStringPartFour;
}

public void mockDoGet()抛出IOException,ServletException {
当(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))
.th en返回(1);
当(mockedHttpServletRequest.getSession())。thenReturn(
mockedHttpSession);
新的ToBeDefinedServlet()。doGet(mockedHttpServletRequest,
mockedHttpServletResponse);

Servlet:

  protected void doGet(HttpServletRequest请求,
HttpServletResponse响应)throws ServletException,IOException {
calculation.setFractionBoolean(Boolean.parseBoolean(request
.getParameter(fractionBoolean)));
calculate.setAssignment(Double.parseDouble(request
.getParameter(randomDigitRange)),Double.parseDouble(request
.getParameter(randomMathematicalOperator)));
PrintWriter out = response.getWriter();

out.println(< html>< body>< table>
+< tr>< td>< h1>
+ calculate.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
+;
$ b $ out.println(< td>< input type = \radio \name = \userInput \value = \
+ possibleAnswer +\>+ possibleAnswerFormat +< / td>);

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


解决方案

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

尝试使用JSF或一些simliar技术。这将使您能够专注于Java方面的功能,这样更容易测试。


The current approach is creating HTML in a ServletTest, run the test, change the Servlet until the test turns into green. However, it feels like that this approach to TDD in Servlets is devious and more time-consuming than TDD ordinary Java classes as HTML created in the ServletTest is copied to the Servlet for the most part and subsequently changed regarding the format (e.g. removing backslashes) instead of testing the output in a Test for ordinary Java Classes and writing most of the code in the main.

ServletTest:

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);
}

Servlet:

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>");
}

解决方案

I think the main problem here is that you are building your html page by manually putting the html elements together from various strings. As you have experienced, this leads to code that is hard to test and maintain.

Try using JSF or some simliar technique instead. This will enable you to focus only on the functionality on the Java side, which is much easier to test.

这篇关于Servlet中当前的TDD方法是否可以优化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆