私はPowerMockをmockitoで動作させようとしています.http://code.google.com/p/powermock/wiki/MockitoUsage13のドキュメントに従っています.
少し単純化するために、静的メソッドがあるとしましょう。
StaticObj.put(String key, String val) { ... }
そして、テストされるクラスは次のようなことを行います:
public class ClassToTest {
public void doSomething(Params p) {
if (StringUtils.isNotBlank(p.getK()) StaticObj.put("k1", p.getK());
if (StringUtils.isNotBlank(p.getX()) StaticObj.put("x1", p.getX());
}
}
私の単体テストでは、 StaticObj.put が K と X が空白でも null でもないときに呼び出されることを確認したいので、次のようにします。
public void testNormalCase() {
// assume that mocking setup for statics already happened in some @Before function..
Params params = new Params("k", "x");
ClassToTest classToTest = new ClassToTest();
classToTest.doSomething(params);
// now I want to verify:
PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");
PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");
}
これは機能し、それは私が期待するものです。うまくいかないのは、K の検証をコメントアウトすると、X の検証が失敗することです! エラー メッセージは、("x1", "x") が予期されていたが、("k1", "k") を取得したことを示しています。どうしてこれなの?これを正しくコーディングしていませんか?
また、合格する次のタイプのテストは、完全に間違った理由で合格する可能性があると私は信じています。
public void testOtherCase() {
// assume that mocking setup for statics already happened in some @Before function..
Params params = new Params("k", null);
ClassToTest classToTest = new ClassToTest();
classToTest.doSomething();
// now I want to verify:
PowerMockito.verifyStatic(never());
StaticObj.put(eq("x1"), anyString());
}
たとえば、powermock が "k1" を見て、"x1" が呼び出されなかったと判断し、パスするかどうかは疑問です。(?)
一般的に言えば、N回呼び出される静的メソッドがあります(Nは入力パラメーターに応じて変化します)。そして、それが正しいケースで呼び出されたことを確認したいと思います(これは入力パラメーターによって決定できます)。私が誤解しない限り、powermock はこれをうまく処理できないようです。
アイデアをありがとう!