読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

Mockito#verifyNoMoreInteractionsの使い方

Mockito

今日のお題は、僕の今の職場でどうやらニワカ人気中らしいMockitoネタです。


さて、最近、大いに活用中のMockitoですが、元々EasyMock使いであった僕からすると、
Mockitoで作成したモックオブジェクトのデフォルトの振る舞いである『何もしない』に若干違和感が無いわけでもない。


だって、『意図していないメソッド呼び出し』があっても検知できないじゃん?というのがその理由。
Mockitoの作者はこれを『過度なテスト』として否定しているし、その理由には納得が行く。


でも。。。たまには厳密ガチガチパラノイアなテストを書きたい時だってあるんです!!

ちょっと病んでるあなたにverifyNoMoreInteractions

verifyNoMoreInteractionsが、まさにあなたのお悩みを解決なわけです。

import static org.mockito.Mockito.*;


class Foo {

    public void doSomething() {
        ...
    }

    public void doOtherthing() {
        ...
    }

    public void doYetAnotherthing() {
        ...
    }
}


class FooConsumer {

    public void consumeFoo(final Foo foo) {
        foo.doSomething();
    }
}


public class FooConsumerTest {

    @Test
    public void consumeFooButDoNothingTest() {
        final Foo fooMock = mock(Foo.class);

        new FooConsumer().consumeFooButDoNothing(fooMock);

        verify(fooMock).doSomething(); // doSomethingは1回だけ呼ばれる
        // verify(fooMock, never()).doOtherthing(); // コレを書いてもテストはpassする。あたりまえだけど。
        verifyNoMoreInteractions(fooMock); // それ以降、fooMockのどのメソッドも呼ばれない
    }
}

ま、こんな感じで使えばOK。