L’approccio attuale al TDD in Servlet potrebbe essere ottimizzato?

L’approccio attuale è la creazione di HTML in un ServletTest, eseguire il test, modificare il servlet fino a quando il test diventa verde. Tuttavia, sembra che questo approccio al TDD in Servlet sia subdolo e più dispendioso in termini di tempo rispetto alle normali classi Java TDD in quanto l’HTML creato nel ServletTest viene copiato per la maggior parte in Servlet e successivamente modificato per quanto riguarda il formato (ad es. Rimozione delle barre retroverse) invece di testare l’output in un Test per classi Java ordinarie e scrivere la maggior parte del codice nel 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 = "" + "

"; private final String doGetHtmlStringPartTwo = "" + "
" + "" + "<input type=\"hidden\" name=\"fractionBoolean\"" + " value=\""; private final String doGetHtmlStringPartThree = "

(\\d)+(\\s\\/\\s(\\d)+)?"; private final String doGetHtmlStringPartFour = "
" + "" + "" + "" + ""; @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("" + "" + "" + "" + "" + ""); for (double possibleAnswer : calculation.getPossibleAnswersArray()) { String possibleAnswerFormat = Boolean.parseBoolean(request .getParameter("fractionBoolean")) == true ? "" + new Fraction(possibleAnswer) + "" : "" + possibleAnswer + ""; out.println(""); } out.println("" + "" + "

" + calculation.getAssignment() + "

" + possibleAnswerFormat + "
" + "
"); }

    Penso che il problema principale qui sia che stai costruendo la tua pagina html mettendo manualmente gli elementi html insieme da varie stringhe. Come hai avuto esperienza, questo porta a un codice difficile da testare e mantenere.

    Prova invece ad usare JSF o qualche tecnica simliar. Questo ti permetterà di concentrarti solo sulla funzionalità sul lato Java, che è molto più facile da testare.