9

我正在测试一些使用 java 库的 groovy 代码,我想模拟库调用,因为它们使用网络。所以被测代码看起来像:

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

我刚刚发现我们总是可以通过 MetaClass 覆盖构造函数,因为 Grails 2 将在每次测试结束时重置 MetaClass 修改。

这个技巧比 Groovy 的要好MockFor。AFAIK,GroovyMockFor不允许我们模拟 JDK 的类,java.io.File例如。但是在下面的示例中,您不能使用File file = new File("aaa")真实对象类型是 a Map,而不是 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构造函数的第二个可选参数是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 回答