EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

Javaの単体テストJunit入門

こんにちは、EatSmartの新人エンジニアです。弊社のサービスの一つであるカロリーチェックAPIの開発を行った際にJava単体テストを行ったのでその流れを振り返ってみたいと思います。

JUnitとは


Javaユニットテストの自動化を行うためのフレームワーク

ユニットテストを書くことで正しく動作しているかを検証することができます

気を付けたいポイント


  • 「前提条件、実行、検証」がわかりやすいコードを書く
  • ユニットテストし易いように対象のクラスを作る
  • 想定されうるケースをできるだけ作る
  • プログラム単体の振る舞いを確認する
    ex) 引数のデータの組み合わせが正しいか、例外が発生した際の振る舞いが正しいか

今回の開発環境


開発環境
サーバー Tomcat
IDE Eclipse
標準API JavaEE
フレームワーク Spring boot
テスト Junit 4
ビルドツール Apache Maven

利用手順(Eclipseで利用の場合)


  1. サンプルプログラムを作成する
  2. テスト用のソース・フォルダーを作成する
  3. Junitへのビルドパスを追加する
  4. テストクラスを配置する
  5. テストを実行する

テスト作成ルール


JUnitで利用するアノテーション


アノテーション 機能
@Before 全てのテスト実行前に行われる処理
@After 全てのテスト後に行われる処理  
@BeforeClass テストメソッド実行前に一度だけ行われる処理
@AfterClass テストメソッド実行後に一度だけ行われる処理
@Test テストメソッドを知らせる


今回使用したアノテーション

アノテーション 機能
@JsonIgnore フィールドが変換対象外になる
@JsonProperty Jsonのプロパティ名を変更する
@JsonInclude 値がnullの場合は出力しない

サンプルコード

テスト対象のSample.javaは次の通りです。
<使用したアノテーションの設定>

  • @JsonIncludeで値がnullの場合は結果を出力しない
  • @JsonIgnoreでxml/jsonの出力をしない

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);

        //パラメーター設定
        Map param = new HashMap();
        param.put("foodCode",bean.getFoodCode());
        param.put("nutritionProvideKbn",bean.getNutritionProvideKbn());

        //検証
        assertTrue(TestUtil.validate(ret,"/calorie/detail",param));

    }