1. ホーム
  2. unit-testing

[解決済み] JUnit を使ってサーブレットをテストする方法

2022-09-06 09:33:02

質問

Javaサーブレットを使ったWebシステムを作成し、JUnitテストを行いたいと考えています。私の dataManager は、データベースに送信する基本的なコードに過ぎません。JUnitでServletをテストするにはどうしたらいいでしょうか?

私のコード例では、ユーザーが登録/サインアップすることができ、それはAJAXを介して私のメインページから送信されます。

public void doPost(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException, IOException{

    // Get parameters
    String userName = request.getParameter("username");
    String password = request.getParameter("password");
    String name = request.getParameter("name");

    try {

        // Load the database driver
        Class.forName("com.mysql.jdbc.Driver");

        //pass reg details to datamanager       
        dataManager = new DataManager();
        //store result as string
        String result = dataManager.register(userName, password, name);

        //set response to html + no cache
        response.setContentType("text/html");
        response.setHeader("Cache-Control", "no-cache");
        //send response with register result
        response.getWriter().write(result);

    } catch(Exception e){
        System.out.println("Exception is :" + e);
    }  
}

どのように解決するのですか?

あなたは、これを行うことができます モッキート を使って、モックに正しいパラメータを返させ、実際に呼び出されたことを確認し(オプションで回数を指定できます)、「結果」を書き、それが正しいかどうかを確認することができます。

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.io.*;
import javax.servlet.http.*;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

public class TestMyServlet extends Mockito{

    @Test
    public void testServlet() throws Exception {
        HttpServletRequest request = mock(HttpServletRequest.class);       
        HttpServletResponse response = mock(HttpServletResponse.class);    

        when(request.getParameter("username")).thenReturn("me");
        when(request.getParameter("password")).thenReturn("secret");

        StringWriter stringWriter = new StringWriter();
        PrintWriter writer = new PrintWriter(stringWriter);
        when(response.getWriter()).thenReturn(writer);

        new MyServlet().doPost(request, response);

        verify(request, atLeast(1)).getParameter("username"); // only if you want to verify username was called...
        writer.flush(); // it may not have been flushed yet...
        assertTrue(stringWriter.toString().contains("My expected string"));
    }
}