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
。だから私は尋ねます:
- このテスト セットアップに正しく取り組んでいますか? それとも、Mockito が推奨する、内部で呼び出すより良いテスト方法はあります
doBuzz
かdoWidget
? と - クラス
doWidget
全体で最も重要なメソッドであるため、モック/スタブについて何ができますか?FizzConfigurator