0

関数の成功をテストするものと、例外が発生したときに失敗した回復コードをテストするものです。

CUT (Class Under Test) インスタンスは、setUp メソッドでインスタンス化されます。

失敗テスト ケースのプリアンブルでは、カットのメソッドの 1 つをオーバーライドして、インスタンスのメタクラスでメソッドをオーバーライドすることにより、例外をスローします。

cut.metaClass.internalWork ={throw new RuntimeException('Failing')}

オブジェクト(静的クラスではない)のメタプログラミングを理解したので、新しいオブジェクトをインスタンス化すると、この新しいオブジェクトのメタクラスは、古いインスタンスで行ったメタプログラミングの影響を受けませんが、それが私が観察していることです。私の成功シナリオを実行すると、失敗テスト ケースに使用されたカット インスタンスで設定された実行時例外が実際にスローされます。

詳細が必要な場合はお知らせください。基本的な理論上の間違いを犯していないことを確認したいだけです。

ありがとう。

アップデート

これは、私のテスト ケースがどのように機能するかを説明するためのものです。

class Cut {
    int fn() {
        internalWork()
        1
    }

    void internalWork() {
        println "Doin work"
    }
}

class WtfTests extends TestSupport {
    @Override
    protected void setUp() {
        println "creating new MS instance"
        cut = new Cut()
    }

    void testSuccess() {
        println "testSuccess"
        cut.fn()
    }

    void testFailure() {
        println "testFailure"
        cut.metaClass.internalWork={->
            println "Won't do work"
            throw new RuntimeException('Failing')
        }
        assert 'Failing'==shouldFail(RuntimeException) {
            cut.fn()
        }
    }
}

そして、これはほとんど期待どおりに機能します。

新しい MS インスタンスの作成
testFailure
作業を行いません
新しい MS インスタンスの作成
testSuccess
作業 を行います

更新 2

ちなみに追加で

registerMetaClass(MyClass)

setUp メソッドを使用して問題を解決しましたが、これはインスタンスのメタクラスではなく静的メタクラスのみを保存することになっているため、上記の例に示すように、これは問題ではないため、完全に混乱しています... ?

4

1 に答える 1

0

CUTメタクラスをクリーンアップする必要があります

テスト

@After
public void tearDown() {
    def remove = GroovySystem.metaClassRegistry.&removeMetaClass
    println "Cleaning CUT"
    remove CUT
    remove CUT1
    remove CUT2
}
于 2012-08-29T12:54:21.483 に答える