【问题标题】:Using spocks method counter on mocks out of compositions?对组合物的模拟使用 spocks 方法计数器?
【发布时间】:2018-10-05 09:27:24
【问题描述】:

我在使用 spock 框架创建测试数据时遇到问题。 为了遵循“组合而不是继承”,我有一个类来为我的单元测试创​​建测试数据。作为一个简单的截图,它看起来像这样:

class TestData extends Specification{

    Foo createFoo(){
        GroovyMock(Foo){
            doSomething() >> "MOCKED!"
        }
    }
}

当我编写一个测试时,我喜欢测试该方法是否被调用以及多久被调用一次。像这样

def "simple test"(){
    given:
    TestData testData = new TestData()
    Foo foo = testData.createFoo()

    when:
    println foo.doSomething()

    then:
    1 * foo.doSomething()
}

我知道,这个测试没有意义。这只是为了说明行为。

我希望该测试的“绿色结果”,因为 doSomething() 已被调用 1 次。但是测试结果是红色的:

Too few invocations for:

1 * foo.doSomething()   (0 invocations)
[...]

当我直接模拟 Foo 时,一切正常:

def "simple test"(){
    given:
    Foo foo = GroovyMock(Foo){
        doSomething() >> "MOCKED!"
    }

    when:
    println foo.doSomething()

    then:
    1 * foo.doSomething()
}

有人知道如何在不从 TestData 派生我的测试类的情况下处理这个问题吗?

顺便说一句。我使用了返回“MOCKED!”的存根。展示,模拟作品。但是,当 testData 创建模拟时,它并没有“覆盖”或其他任何名称。

【问题讨论】:

    标签: unit-testing testing groovy spock


    【解决方案1】:

    Mocks 交互必须在使用它们的Specification 中定义。从其他来源导入模拟,例如

    TestData testData = new TestData()
    Foo foo = testData.createFoo()
    

    不支持。

    虽然可以在 Specification 之外创建模拟并稍后附加它们,但无法在 Specification 之外定义交互。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多