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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント