junit+mockitoを使用したmockテストの例

5891 ワード

ウェブサイトを始めたばかりの頃、テストはすべてこのように(例えばユーザー情報のフォームロジックをテスト修正する):ブレークポイントを設定し、実行プログラムを起動し、ログインし、クリックしてクリックしてテストのページに入り、テストデータを入力し、ブレークポイントに入る.......大きなプログラムの起動が遅く、ログインし、多くのフォーム情報を入力してテストに入るコードは、私の心がほとんど崩壊しています.その時、ウェブプログラムをテストして普通のプログラムをテストするように、テストするコードを直接テストすればいいと思っていました.その後、mockテストが可能であることが分かった.

mockテスト例


新しいmavenプロジェクトを作成し、junitとmockitoの依存を追加します.
    <dependency>
        <groupId>org.mockitogroupId>
        <artifactId>mockito-allartifactId>
        <version>1.8.4version>
    dependency>

    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.8.2version>
    dependency>

コントロールとしてservletクラスを新規作成します.
public class StudentController extends HttpServlet{

    @Override
    public void doGet(HttpServletRequest request,HttpServletResponse response){
        String name = request.getParameter("name");
        System.out.println(name);
    }

    @Override
    public void doPost(HttpServletRequest request,HttpServletResponse response){

    }

}

次に、このサーブレットのdoGetdoPostの方法をテストします.新しいJunitテストクラスは次のとおりです.
// import 
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.junit.Before;
import org.junit.Test;

public class TestStudentController {

    private HttpServletRequest request;
    private HttpServletResponse response;
    private StudentController studentController;

    @Before
    public void setUp() throws Exception {
        request = mock(HttpServletRequest.class);
        response = mock(HttpServletResponse.class);
        when(request.getParameter("name")).thenReturn("123");
    }

    @Test
    public void testDoGet() {
        studentController = new StudentController();
        studentController.doGet(request, response);
    }

    @Test
    public void testDoPost() {
    }

}

上のコードを分析してみましょう.まず、テストするdoGet(request, response)です.doGetには2つのパラメータが必要です.そして、この2つのパラメータは容器から入ってきて、自分では作成できません.だから、1つをシミュレートします.次のようになります.
request = mock(HttpServletRequest.class);
response = mock(HttpServletResponse.class);

オブジェクトはシミュレーションされていますが、オブジェクトの動作はまだシミュレーションされていません.サーブレットのdoGet法がrequest.getParameter("name")を用いていることを見出し,シミュレーション対象にこのシミュレーション挙動を追加した.次のようになります.
when(request.getParameter("name")).thenReturn("123");

シミュレーションオブジェクトがgetParameter("name")メソッドを呼び出すたびに、123が実際に実行されたかのように、request.getParameter("name")の値が返されます.
要するに、mockテストは、自分で作成できないものが必要な場合は、mock()を出て、when()で必要なシミュレーション動作を追加します.

リファレンス


1、Java Mocking入門—Mockito 2、ソースコードを使ってダウンロードする