Javaの単体テストJunit入門
こんにちは、EatSmartの新人エンジニアです。弊社のサービスの一つであるカロリーチェックAPIの開発を行った際にJavaの単体テストを行ったのでその流れを振り返ってみたいと思います。
JUnitとは
ユニットテストを書くことで正しく動作しているかを検証することができます
気を付けたいポイント
- 「前提条件、実行、検証」がわかりやすいコードを書く
- ユニットテストし易いように対象のクラスを作る
- 想定されうるケースをできるだけ作る
- プログラム単体の振る舞いを確認する
ex) 引数のデータの組み合わせが正しいか、例外が発生した際の振る舞いが正しいか
今回の開発環境
開発環境 | |
---|---|
サーバー | Tomcat |
IDE | Eclipse |
標準API | JavaEE |
フレームワーク | Spring boot |
テスト | Junit 4 |
ビルドツール | Apache Maven |
利用手順(Eclipseで利用の場合)
- サンプルプログラムを作成する
- テスト用のソース・フォルダーを作成する
- Junitへのビルドパスを追加する
- テストクラスを配置する
- テストを実行する
テスト作成ルール
JUnitで利用するアノテーション
アノテーション | 機能 |
---|---|
@Before | 全てのテスト実行前に行われる処理 |
@After | 全てのテスト後に行われる処理 |
@BeforeClass | テストメソッド実行前に一度だけ行われる処理 |
@AfterClass | テストメソッド実行後に一度だけ行われる処理 |
@Test | テストメソッドを知らせる |
今回使用したアノテーション
アノテーション | 機能 |
---|---|
@JsonIgnore | フィールドが変換対象外になる |
@JsonProperty | Jsonのプロパティ名を変更する |
@JsonInclude | 値がnullの場合は出力しない |
サンプルコード
テスト対象のSample.javaは次の通りです。
<使用したアノテーションの設定>
import java.math.BigDecimal; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; public class Sample { @JsonInclude(JsonInclude.Include.NON_NULL) private BigDecimal rowNumber; private String foodName; @JsonIgnore private BigDecimal standardAmount; private String standardAmountUnit; @JsonProperty(value="contentsAmount") @JacksonXmlProperty(localName="contentsAmount") public String getContentsAmountStr() { if (contentsAmount == null) { return "0"; } return FormatUtil.format(contentsAmount, 2, "#########");
上のサンプルに対するJUnitは次のようになります
- テストメソッドはassertTrueで設定
- テストに成功すればグリーンで返ってくる
import static org.junit.Assert.*; import java.util.HashMap; import java.util.Map; import org.junit.Before; import org.junit.Test; public class SampleTest { @Before public void setUp() throws Exception { TestUtil.initialize(); } @Test public void testXml_OK() throws Exception { //結果取得 SamplelBean bean = new SampleBean(); bean.setFoodCode("00"); bean.setNutritionProvideKbn("01"); SampleBean ret = new SamplelAction().xml(bean); //パラメーター設定 Mapparam = new HashMap (); param.put("foodCode",bean.getFoodCode()); param.put("nutritionProvideKbn",bean.getNutritionProvideKbn()); //検証 assertTrue(TestUtil.validate(ret,"/calorie/detail",param)); }