Spring BootのRESTControllerをJUnit4でテストする

Spring BootのRESTControllerをJUnit4でテストする

RESTControllerをJUnitでテストします。

JUnitでテストする際は、src/main/java配下、src/test/java配下は同一階層のパッケージにしておきます。

DemoControllerクラスに対して、テストクラスはDemoControllerTestクラスというように最後にTestを付けます。

DemoControllerTestクラスの中身は以下のような感じになります。

package jp.co.confrage;

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;

import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)
public class DemoControllerTest {

  @Autowired
  private EmployeeRepository repository;

  @Autowired
  private TestRestTemplate template;

  @LocalServerPort
  private int port;

  private String apiEndPoint;

  Employee emp;

  @Before
  public void setup() {
    repository.deleteAll();// 最初にテーブルのデータを削除
    emp = new Employee();
    // ~~各カラムをセット
    repository.saveAll(Arrays.asList(emp));// 最後にテーブルに保存
  }

  @Test
  public void 適当にテスト() {
    apiEndPoint = "http://localhost" + port + "/getXX";
    Map<String,Object> obj = template.getForObject(apiEndPoint, LinkedHashMap.class);
    JSONObject json = new JSONObject(obj);

    // なにか処理
  }
}

Spring4.3から@RunWith(SpringRunner.class)と書くように変わったようです。

@SpringBootTest()で良いですが、RESTControllerのテストの場合のみ@SpringBootTest(webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT)と記述します。

TestRestTemplateクラスを使用してGETやPOSTを実際に実行することができます。この際のポートはべた書きではダメで以下のように記述します。

@LocalServerPort private int port;

getForObjectでGETのテストができます。

postForObjectでPOSTのテストができます。

Spring bootのテストではmockitoをデフォルトで使うようです。AssertJも使えました。

ヘッダ、リクエストボディを渡す

REST APIがPUTやPOSTの場合、リクエストボディがありますし、ヘッダ情報を渡したいケースもあると思います。

その場合、HttpHeaderクラスのインスタンスを生成します。

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Type", "application/json");

ヘッダ情報をaddかsetしたら次に、リクエストボディを作成します。

Map<String, Object> body = new HashMap<>();

HttpEntityクラスのインスタンスを以下のように作成します。

HttpEntity<Map<String, Object>> request = new HttpEntity<>(body, httpHeaders);

URL作成します。

final String baseUrl = "http://localhost:" + port + "/test";
final URI uri = new URI(baseUrl);

最後にTestRestTemplateクラスのインスタンスのメソッドを実行します。postForEntityメソッドはPOST用のメソッドです。

ResponseEntity<String> result = template.postForEntity(uri, request, String.class);

参考サイト:https://howtodoinjava.com/spring-boot2/testing/testresttemplate-post-example/

テストごとにロールバックする

コントローラからテストするときにロールバックしたいときは、以下のように@Transactionalアノテーションも付与します。

@SpringBootTest
@Transactional
public class SampleTest {
...
}

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました