Posted at

JMockit MockUp

More than 3 years have passed since last update.

@Mocked + Expectations(NonStrictExpectations)と何が違うの?って話です。


BehaviorBasedとStateBased

前述の通り通常はBehaviorBased

@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()が実行されて新しいインスタンスが返されます。