LoginSignup
195
219

More than 5 years have passed since last update.

JUnit・JMockitチートシート

Last updated at Posted at 2014-03-25

JUnitによるユニットテスト

4フェーズテスト

Example
public class FourPhaseTest {
    @Test
    public void testCase() throws Exception{
        // 1.初期化
        Calc sut = new Calc();
        int expected = 7;
        // 2.テスト実行
        int actual = sut.add(3.4);
        //3.アサーション
        assertThat(actual, is(expected));
        //4.終了処理(必要な場合)
        sut.shutdown();
    }
}

例外送出のテスト

Sample
@Test(expected=Exception.class)
public void testCase() {
}

タイムアウト

Sample
@Test(timeout=1000L)
public void testCase() {
}

アノテーション

アノテーション 説明
@Test テストケース
@Ignore テストの実行を除外
@Before 初期化
@After 後処理
@BeforeClass 初期化(クラスごと)
@AfterClass 後処理(クラスごと)
@RunWith テストランナー

アサーション

アサーション
assertThat(actual, is(expected));
fail("未実装");

ルール

ルール 説明
TemporaryFolder 一時ファイル
ExternalResource 外部リソース
Verfier 事後検証
ErrorCollector エラーの収集
ExpectedException 例外の検証
Timeout タイムアウト
TestWatcher テストの監視
TestName テストケース名
Sample
public class RuleTest {
    @Rule
    public TestRule rule = new SomeRule();
    @ClassRule
    public static TestRule RULE = new SomeRule();
}

構造化テスト

Sample
@RunWith(Enclosed.class)
public class EnclosedTest {
    public static class XXの場合 {
        @Before
        public void setup() {
        }
        @Test
        public void testCase() {
        }
    }
    public static class YYの場合 {
        @Before
        public void setup() {
        }
        @Test
        public void testCase() {
        }
    }
}

パラメータ化テスト

Sample
@RunWith(Theories.class)
public class ParameteriedTest {
    @DataPoints
    public static int[] PARAMS = { 1, 2, 3, 4 };
    @Theory
    public void test(int x) {
    }
}

カテゴリ化テスト

Sample
@Category(DbTests.class)
public class CategoriedTest {
    @Test
    @Category(SlowTests.class)
    public void testCase() {
    }
}

Matcher API

基本機能

クラス メソッド 概要
CoreMatchers/Matchers is 対象オブジェクトが期待値と一致するかチェック
CoreMatchers/Matchers equalTo 対象オブジェクトと期待値オブジェクトの一致チェック。オブジェクトのequalToメソッドで比較する。
Matchers hasToString 対象オブジェクトをtoStringした結果が期待文字列と一致するかチェック
CoreMatchers/Matchers not macherの非定型を作成する。

複数の期待条件を組み合わせる機能

クラス メソッド 概要
CoreMatchers/Matchers allOf 対象オブジェクトを複数のMacherでチェックして、全てがtrueであるかどうかをチェック
CoreMatchers/Matchers anyOf 対象オブジェクトを複数のMacherでチェックして、どれか一つでもtrueであるかどうかをチェック
CoreMatchers/Matchers both 対象オブジェクトを二つのMacherでチェックして、両方共にtrueかどうかチェック
CoreMatchers/Matchers either 対象オブジェクトを二つのMacherでチェックして、どちらか一方でもtrueかどうかチェック
Matchers isIn 対象オブジェクトが期待するCollectionオブジェクトの中に含まれているかどうかをチェック。期待値にCollectionをセットする。
Matchers isOneOf 対象オブジェクトが期待するCollectionオブジェクトの中に含まれているかどうかをチェック。期待値に可変長引数をセットする。

文字列の検証に使用する機能

クラス メソッド 概要
Matchers isEmptyString 対象文字列が空白かどうかチェック。nullはNG
Matchers isEmptyOrNullString 対象文字列が空白、もしくはnullかどうかチェック
CoreMatchers/Matchers startsWith 対象文字列の先頭が期待値で始まっているかをチェック
CoreMatchers/Matchers endsWith 対象文字列の末尾が期待値文字列であるかどうかをチェック
CoreMatchers/Matchers containsString 対象文字列に期待文字列が含まれているかをチェック
Matchers equalToIgnoringCase 対象文字列と期待値文字列の一致チェック。大文字と小文字を区別しない。
Matchers equalToIgnoringWhiteSpace 対象文字列と期待値文字列の一致チェック。空白スペースがある場合に空白スペースの数を意識しない。
Matchers samePropertyValuesAs 対象文字列に対し、期待値の文字が順番で含まれているかをチェック
Matchers stringContainsInOrder 対象文字列に対し、期待値の文字が順番で含まれているかをチェック

数値の検証に利用する機能

クラス メソッド 概要
Matchers comparesEqualTo 対象数値が期待数値と一致しているかチェック。isよりもメッセージが詳細
Matchers greaterThan 対象数値は期待数値より大きい(actual > expected)かどうかをチェック
Matchers greaterThanOrEqualTo 対象数値は期待数値より以上(actual >= expected)かどうかをチェック
Matchers lessThan 対象数値は期待数値未満(actual < expected)かどうかをチェック
Matchers lessThanOrEqualTo 対象数値は期待数値以下(actual <= expected)かどうかをチェック
Matchers closeTo 対象数値が期待される基準値から±指定値の範囲内に収まっているかをチェック

nullチェック系(文字列のチェックについては上記「文字列の検証に使用する機能」参照)

クラス メソッド 概要
CoreMatchers/Matchers notNullValue 対象オブジェクトがnullでないことをチェック
CoreMatchers/Matchers nullValue 対象オブジェクトがnullであることをチェック

Listや配列など、チェック対象値が複数の場合に使用する機能

クラス メソッド 概要
Matchers array 対象配列オブジェクトの要素それぞれに対して、期待値の条件を満たすかどうかをチェック
Matchers arrayContaining 対象オブジェクトのそれぞれに対して期待値と一致するかチェック。順番の整合性もチェック
Matchers arrayContainingInAnyOrder 対象配列オブジェクトのそれぞれに対して期待値と一致するかチェック。順番の整合性はチェックしない。
Matchers arrayWithSize 対象配列オブジェクトのサイズが期待値と一致するかチェック
Matchers contains 対象オブジェクトのそれぞれに対して期待値と一致するかチェック。順番の整合性もチェック
Matchers containsInAnyOrder 対象オブジェクトのそれぞれに対して期待値と一致するかチェック。順番の整合性はチェックしない
Matchers empty 対象Colelctionオブジェクトが空かどうかをチェック
Matchers emptyArray 対象配列が空オブジェクトかどうかをチェック
Matchers emptyCollectionOf 対象配列オブジェクトが空かどうかをチェック。型のチェックも行う。
Matchers emptyIterable 対象Iterableオブジェクトが空かどうかをチェック
Matchers emptyIterableOf 対象Iterableオブジェクトが空かどうかをチェック。型のチェックも行う。
CoreMatchers/Matchers everyItem 対象オブジェクトの全ての要素に対して期待値を満たすかどうかをチェック
CoreMatchers/Matchers hasItem 対象Iterableオブジェクトの中に期待値を満たすオブジェクトが含まれているかどうかをチェック
Matchers hasItemInArray 対象配列オブジェクトの中に期待値を満たすオブジェクトが含まれているかどうかをチェック
Matchers hasItems 対象Iterableオブジェクトの中に期待値を満たすオブジェクトが含まれているかどうかをチェック。期待値には複数条件を設定出来る。
Matchers hasSize 対象Collectionオブジェクトのサイズチェック
Matchers iterableWithSize 対象Iterablesの型と要素数が期待値と一致するかをチェック

Mapのチェックに使用する機能

クラス メソッド 概要
Matchers hasEntry 対象Mapに期待のkey,valueが入っているかチェック
Matchers hasKey 対象Mapに期待されるkeyが入っているかをチェック
Matchers hasValue 対象Mapに期待されるvalueが入っているかチェック

インスタンスや型をチェックする系

クラス メソッド 概要
CoreMatchers/Matchers any 対象オブジェクトが期待するクラスのインスタンスであるかをチェック。instanceOfと同じ
CoreMatchers/Matchers instanceOf 対象オブジェクトが期待するクラスのインスタンスであるかをチェック
CoreMatchers/Matchers isA 対象オブジェクトのクラスが期待値のものであるかをチェック
CoreMatchers/Matchers sameInstance 対象オブジェクトが期待するオブジェクトと同じインスタンスであることをチェック
CoreMatchers/Matchers theInstance 対象オブジェクトが期待するクラスのインスタンスであるかをチェック
Matchers typeCompatibleWith 対象オブジェクトが期待するクラスを継承しているかチェック

その他

クラス メソッド 概要
CoreMatchers/Matchers anything 常にtrueになる。このオブジェクトはチェックしなくて良いということを明示する為の機能
CoreMatchers/Matchers describedAs エラー時に表示される文言を上書きする
Matchers eventFrom 対象イベントオブジェクトの発生元が期待値であるかをチェック
Matchers hasProperty 対象JavaBeansオブジェクトに期待する名称のプロパティが存在するかチェック
Matchers hasXPath 対象XMLドキュメントに期待するパスが存在するかをチェック

カスタムMatcher

Sample
//カスタムMatcher定義
public class EvenNum extends TypeSafeMatcher<Integer> {
    private Integer expected;
    public EvenNum(Integer expected){
        this.expected = expected;
    }
    @Override
    protected boolean matchesSafely(Integer item) {
        return item % expected == 0;
    }
    @Override
    public void describeTo(Description description) {
        description.appendText("<"+expected+"で割り切れる>");
    }
}

//カスタムMatcherによるassert
@Test
public void test() {
    assertThat(10, is(new EvenNum(2)));
}

jMockitによるモック化

メソッドのモック化

Sample
public class SimpleTest {
    @Mocked
    private Simple mockSimple;
    @Test
    public void testGetSample() throws Exception {
        new NonStrictExpectations() {{
            mockSimple.getSample(); result = "Mock Text";
        }};
    }
}

staticメソッドのモック化

Sample
public class SimpleTest {
    @SuppressWarnings("unused")
    @Mocked
    private Simple mockSimple;
    @Test
    public void testGetSample() throws Exception {
        new NonStrictExpectations() {{
            Simple.getSample(); result = "Mock Text";
        }};
    }
}

内部newクラスのモック化

Sample
public class SimpleTest {
    @Mocked
    private SampleInner mockSampleInner;
    @Test
    public void testGetSample() {
        new NonStrictExpectations() {{
            mockSampleInner.isSample(anyString); result = true;
        }};
    }
}

privateメソッドのモック化

Sample
public class SimpleTest {
    @Mocked("isSample")
    private Simple sample;
    @Test
    public void testGetSample() {
        new NonStrictExpectations() {{
            invoke(sample,"isSample",anyString); result = true;
        }};
    }
}

例外のモック化

Sample
public class SimpleTest {
    @Mocked
    private Simple mockSimple;
    @Test
    public void testGetSample() throws Exception {
        new NonStrictExpectations() {{
            mockSimple.getSample(); result = new Exception();
        }};
    }
}

メソッドのみモック化

Sample
public class SimpleTest {
    @Test
    public void testPutSample() {
        new MockUp<Simple>() {
            @Mock
            void putSample() {
            }
        };
    }
}

コンストラクタのモック化

Sample
public class ConstructorSampleTest {
    @Test
    public void test() {
    new MockUp<ConstructorSample>() {
        @Mock void $init() {
        }
    };
    new ConstructorSample();
    }
}

メソッドチェインをモック化

Sample
class Hoge {
    public Fuga getFuga() { ... }
}

class Fuga {
    public String getText() {...}
}

public class SimpleTest {
    @Cascading
    Hoge hoge;
    @Test
    public void test() {
        new NonStrictExpectations() {{
            hoge.getFuga().getText(); result="sample";
        }};
    }   
}

privateな要素にアクセスする

Sample
public class SimpleTest {
    @Test
    public void test() {
        Fuga sample = Deencapsulation.newInstance(Sample.class);
        Deencapsulation.invoke(sample, "method");
        Deencapsulation.setField(sample, "instanceField", "fugaaa");
    }
}

参考

JUnit実践入門
技術開発事業部blog 最強モックツール JMockit・Matcherの使い方シリーズ
jMockit そんな無理矢理privateなトコロに…
JMockit使い方メモ



195
219
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
195
219