13

FizzConfigurator次のようなクラスの単体テストを作成しています。

public class FizzConfigurator {
    public void doFoo(String msg) {
        doWidget(msg, Config.ALWAYS);
    }

    public void doBar(String msg) {
        doWidget(msg, Config.NEVER);
    }

    public void doBuzz(String msg) {
        doWidget(msg, Config.SOMETIMES);
    }

    public void doWidget(String msg, Config cfg) {
        // Does a bunch of stuff and hits a database.
    }
}

doWidget(String,Config)メソッドをスタブ化する (実際に起動してデータベースにアクセスしないようにする)単純な単体テストを作成したいと思いますが、これにより、呼び出しが最終的に実行されることを確認できます。Mockito は、ここでの仕事に適したツールのようです。doBuzz(String)doWidget

public class FizzConfiguratorTest {
    @Test
    public void callingDoBuzzAlsoCallsDoWidget() {
        FizzConfigurator fixture = Mockito.spy(new FizzConfigurator());
        Mockito.when(fixture.doWidget(Mockito.anyString(), Config.ALWAYS)).
            thenThrow(new RuntimeException());

        try {
            fixture.doBuzz("This should throw.");

            // We should never get here. Calling doBuzz should invoke our
            // stubbed doWidget, which throws an exception.
            Assert.fail();
        } catch(RuntimeException rte) {
            return; // Test passed.
        }
    }
}

これは良いゲームプランのように思えます (少なくとも私には)。しかし、実際にコーディングすると、テストメソッド内の 2 行目 (Mockito.when(...)行:

Mockito 型の when(T) メソッドは、引数 (void) には適用できません。

Mockito は を返すメソッドをモックできないことがわかりましたvoid。だから私は尋ねます:

  1. このテスト セットアップに正しく取り組んでいますか? それとも、Mockito が推奨する、内部で呼び出すより良いテスト方法はありますdoBuzzdoWidget? と
  2. クラスdoWidget全体で最も重要なメソッドであるため、モック/スタブについて何ができますか?FizzConfigurator
4

4 に答える 4

28

それをテストするために例外を使用するのではなく、検証を使用します。when()もう 1 つの問題は、 void を返すメソッドでは使用できないことです。

これが私がそれを行う方法です:

FizzConfigurator fixture = Mockito.spy(new FizzConfigurator());
doNothing().when(fixture).doWidget(Mockito.anyString(), Mockito.<Config>any()));
fixture.doBuzz("some string");
Mockito.verify(fixture).doWidget("some string", Config.SOMETIMES);
于 2013-02-04T15:55:55.413 に答える