7

私は現在、JMock を含むいくつかのテストを書いています。次のコードの構造が理解できません。

context.checking(new Expectations() {  //context is of type Mockery of course
            {
                allowing(csv).getFileName();
                will(returnValue(fileName));
            }
        });

私の知る限り、ゆっくりと分析すると、

context.checking(new Expectations() { ... }

これにより、 の無名インスタンスが生成されますExpectations。しかし、なぜこの直後に別の括弧があり、その後に奇妙な静的なメソッドがあり、allowing() などがあるのでしょうか? ここで何が起こっているのかをJavaの観点から誰かが説明してくれたら、とても感謝しています。

4

3 に答える 3

6

中かっこの 2 番目のセットはインスタンスの初期化ブロックを形成し、そのコードはコンパイラによってクラスのすべてのコンストラクターにコピーされます。これにより、インスタンス メンバーにアクセスできます。JMock の API の場合、簡潔な方法で期待値を初期化できます。テンプレート メソッドを使用すると、同等のことを実現できます (ただしExpectations、コンストラクターからのオーバーライド可能なメソッドへの安全でない呼び出しについて、それ自体をコンパイルするときに警告が表示されます)。

public abstract class Expectations {
    public Expectations() {
        buildExpectations();
    }

    protected abstract void buildExpectations();

    ...
}

そしてあなたのテストで

context.checking(new Expectations() {
    protected void buildExpectations() {
        allowing(csv).getFileName();
        will(returnValue(fileName));
    }
});

私は間違いなく短いバージョンを好みます。:)

于 2012-05-26T20:12:03.010 に答える
6

インスタンス初期化子は興味深いものです。それらが多く使用されているのを私が実際に見た唯一の場所は、JMock です。より単純でわかりやすいコンテキストを考えてみましょう。マップを作成してアイテムを追加できます。

Map<String,String> map = new HashMap<String,String>(){
    {
        put("One","Something");
        put("Two","Other");
    }
};

おそらく、これは JMock が何をしているかを理解するのに役立つでしょう。

于 2012-05-26T20:12:45.143 に答える
1

一部の人々は、静的メソッドを使用して静的イニシャライザーで期待値を作成すると、期待値を指定するための見栄えが良く、簡潔で、流暢で読みやすい構文が提供されると信じています-そして私はそれらに同意します。厄介な構文は、モックフレームワークのクールなものであるだけでなく、内部にはクールなバイトコード操作がたくさんあります。

于 2012-05-26T19:50:47.153 に答える