LoginSignup
5
9

More than 5 years have passed since last update.

JMockit MockUp

Posted at

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

5
9
0

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
5
9