@Mocked + Expectations(NonStrictExpectations)と何が違うの?って話です。
BehaviorBasedとStateBased
@Mocked
private Fuga fuga;
:
:
new Expectations(){{
fuga.getName(); result="ホゲ男";
}}
こんな感じで書きますが、MockUpというStateBasedな書き方もあります。
StateBasedの書き方
モックの宣言
private PageEntityService pageEntityService = new PageEntityService();
@BeforeClass
public static void beforeClass() {
new MockUp<PageEntityService>() {
@Mock
public Page createNewContent() {
return new Page();
}
};
}
テストメソッド
@Test
public void test() {
PageCreateAction pageCreator = new PageCreateAction();
Deencapsulation.setField(pageCreator, pageEntityService);
pageCreator.process(site);
new Verifications() {{
List<Page> pages;
pageRepository.save(pages = withCapture());
assertThat(pages.size(), is(0));
}};
}
- 別に@BeforeClassで宣言しなければならないわけではないです
- PageEntityServiceをnewする前にMockUpをnewしておく必要があります
- 上記例では無名クラスをnewしていますが、
class MockPageEntityService extends MockUp<PageEntityService>
を宣言してnewする形でも構いません - モック化したいメソッドをMockUpでも定義して、@Mockアノテーションをつけます
BehaviorBasedと何が違うの?
@Mocked
private PageEntityService pageEntityService;
:
:
new Expectations(){{
pageEntityService.createNewContent(); result=new Page();
}}
これでも「だいたい同じじゃね?」と思われるかもしれません。
決定的な違いは new Page() の呼ばれる回数です。
BehaviorBasedの例では1回しか呼ばれません。
すなわち、createNewContentを何回callしても毎回同じPageインスタンスが返されます。
(resultにはクロージャがセットされるわけではなく、newされたPageインスタンスがセットされるためです)
対してStateBasedの例では毎回new Page()が実行されて新しいインスタンスが返されます。