JUnit・JMockitチートシート

More than 5 years have passed since last update.


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使い方メモ