9

Java ライブラリを使用するグルーヴィーなコードをテストしていますが、ネットワークを使用するため、ライブラリ呼び出しをモックアウトしたいと考えています。したがって、テスト対象のコードは次のようになります。

def verifyInformation(String information) {
    def request = new OusideLibraryRequest().compose(information)
    new OutsideLibraryClient().verify(request)
}

MockFor と StubFor を使用してみましたが、次のようなエラーが発生します。

No signature of method: com.myproject.OutsideLibraryTests.MockFor() is applicable for argument types: (java.lang.Class) values: [class com.otherCompany.OusideLibraryRequest]  

Grails 2.0.3 を使用しています。

4

2 に答える 2

10

Grails 2 は各テストの最後に MetaClass の変更をリセットするため、MetaClass を介していつでもコンストラクターを上書きできることがわかりました。

このトリックは、Groovy の よりも優れていMockForます。私の知る限り、Groovyでは、たとえばMockForJDK のクラスをモックすることはできません。java.io.Fileただし、以下の例ではFile file = new File("aaa")、実際のオブジェクト タイプが aMapではなく a であるため、使用できませんFile。例は Spock 仕様です。

def "test mock"() {
    setup:
    def fileControl = mockFor(File)
    File.metaClass.constructor = { String name -> [name: name] }
    def file = new File("aaaa")

    expect:
    file.name == "aaaa"
}
于 2013-01-24T13:51:46.700 に答える
6

MockForのコンストラクタへの 2 番目のオプション パラメータはinterceptConstructionです。これを true に設定すると、コンストラクターをモックできます。例:

import groovy.mock.interceptor.MockFor
class SomeClass {
    def prop
    SomeClass() {
        prop = "real"
    }
}

def mock = new MockFor(SomeClass, true)
mock.demand.with {
    SomeClass() { new Expando([prop: "fake"]) }
}
mock.use {
    def mockedSomeClass = new SomeClass()
    assert mockedSomeClass.prop == "fake"
}

ただし、このような groovy オブジェクトのみをモック化できることに注意してください。Java ライブラリに行き詰まっている場合は、Java オブジェクトの構築をファクトリ メソッドにプルして、それをモックすることができます。

于 2012-05-14T19:16:35.853 に答える