JUnit・JMockitチートシート


##JUnitによるユニットテスト

###4フェーズテスト
```java: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();
	}
}
```

###例外送出のテスト
```java:Sample
@Test(expected=Exception.class)
public void testCase() {
}
```

###タイムアウト
```java: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|テストケース名|
```java:Sample
public class RuleTest {
	@Rule
	public TestRule rule = new SomeRule();
	@ClassRule
	public static TestRule RULE = new SomeRule();
}
```

###構造化テスト
```java: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() {
		}
	}
}
```

###パラメータ化テスト
```java:Sample
@RunWith(Theories.class)
public class ParameteriedTest {
	@DataPoints
	public static int[] PARAMS = { 1, 2, 3, 4 };
	@Theory
	public void test(int x) {
	}
}
```

###カテゴリ化テスト
```java: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
```java: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によるモック化

###メソッドのモック化
```java:Sample
public class SimpleTest {
	@Mocked
	private Simple mockSimple;
	@Test
	public void testGetSample() throws Exception {
 		new NonStrictExpectations() {{
	  		mockSimple.getSample(); result = "Mock Text";
		}};
	}
}
```

###staticメソッドのモック化
```java:Sample
public class SimpleTest {
	@SuppressWarnings("unused")
	@Mocked
	private Simple mockSimple;
	@Test
	public void testGetSample() throws Exception {
 		new NonStrictExpectations() {{
	  		Simple.getSample(); result = "Mock Text";
		}};
	}
}
```

###内部newクラスのモック化
```java:Sample
public class SimpleTest {
	@Mocked
	private SampleInner mockSampleInner;
	@Test
	public void testGetSample() {
		new NonStrictExpectations() {{
			mockSampleInner.isSample(anyString); result = true;
    	}};
	}
}

```

###privateメソッドのモック化
```java:Sample
public class SimpleTest {
	@Mocked("isSample")
	private Simple sample;
	@Test
	public void testGetSample() {
		new NonStrictExpectations() {{
			invoke(sample,"isSample",anyString); result = true;
		}};
	}
}

```

###例外のモック化
```java:Sample
public class SimpleTest {
	@Mocked
	private Simple mockSimple;
	@Test
	public void testGetSample() throws Exception {
 		new NonStrictExpectations() {{
	  		mockSimple.getSample(); result = new Exception();
		}};
	}
}
```


###メソッドのみモック化
```java:Sample
public class SimpleTest {
	@Test
	public void testPutSample() {
		new MockUp<Simple>() {
			@Mock
			void putSample() {
			}
		};
	}
}
```

###コンストラクタのモック化
```java:Sample
public class ConstructorSampleTest {
	@Test
	public void test() {
 	new MockUp<ConstructorSample>() {
		@Mock void $init() {
		}
 	};
	new ConstructorSample();
	}
}
```

###メソッドチェインをモック化
```java: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な要素にアクセスする
```java:Sample
public class SimpleTest {
    @Test
    public void test() {
        Fuga sample = Deencapsulation.newInstance(Sample.class);
        Deencapsulation.invoke(sample, "method");
        Deencapsulation.setField(sample, "instanceField", "fugaaa");
    }
}
```


## 参考
[JUnit実践入門](http://www.amazon.co.jp/JUnit%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-~%E4%BD%93%E7%B3%BB%E7%9A%84%E3%81%AB%E5%AD%A6%E3%81%B6%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E6%8A%80%E6%B3%95-WEB-PRESS-plus/dp/477415377X/ref=sr_1_1?ie=UTF8&qid=1392442555&sr=8-1)
[技術開発事業部blog 最強モックツール JMockit・Matcherの使い方シリーズ](http://genesis-tdsg.blogspot.jp/2013/08/jmockit.html)
[jMockit そんな無理矢理privateなトコロに…](http://qiita.com/NewGyu/items/9fbc6fae4104ce64aa8f)
[JMockit使い方メモ](http://qiita.com/opengl-8080/items/a49d4dae9067413ccdd6)
[]()
[]()
[]()
[]()