12

私は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 はこれをうまく処理できないようです。

アイデアをありがとう!

4

2 に答える 2

6

私はこの質問と問題を注意深く読みましたが、それらを明確に理解したかどうかはわかりません-私の理解から、kとxを渡したときにpowermockが例外を発生させ、kのみを検証するのは正しいことです。

静的メソッドStaticObj.putをモックしているため、パラメーターkとxを渡して、

PowerMockito.verifyStatic(times(1));
StaticObj.put("k1", "k1");

PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x"); 

これは機能するはずです。また、パラメータkとxを検証すると、kの検証がコメントアウトされます。

// PowerMockito.verifyStatic(times(1));
// StaticObj.put("k1", "k1");

PowerMockito.verifyStatic(times(1));
StaticObj.put("x1", "x");

Powermockは最初にput( "k1" ...)を使用して呼び出しを取得するため、xの検証でエラーが発生します。検証プロセスは順番に行われます。

于 2012-07-19T02:27:16.257 に答える