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 {
...
}

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント