当前位置: 首页 > 知识库问答 >
问题:

Stubbed方法应根据Spock中给定的模拟参数返回值

百里鸿祯
2023-03-14
class ExampleSpec extends Specification {

    def "should return second value of list of return values"() {
        given:
        Person personBob = Mock()
        Person personJackson = Mock()
        PersonHelper stubbedPerson = Stub()

        stubbedPerson.getNameOfBrother(personBob) >> "Billy Bob";
        stubbedPerson.getNameOfBrother(personJackson) >> "Tommy Jackson";

        when:
        String actual = stubbedPerson.getNameOfBrother(personBob)
        String actual2 = stubbedPerson.getNameOfBrother(personJackson)

        then:
        actual == "Billy Bob" // true
        actual2 == "Tommy Jackson" // false "Billy Bob"
    }

}

测试失败,因为第二次调用varactual2仍然返回Billy Bob而不是Tommy Jackson。我知道有一种方法可以通过调用顺序返回不同的值,但我想让它依赖于给定的模拟。

使用普通值--没有模拟/存根代理--作为参数值实际上是有效的。我假设Spock引擎在两个模拟之间不会有差异。但我不确定这一点,因为代理确实有ID作为实例字段。

共有1个答案

郑俊弼
2023-03-14

对于记录--使用模拟对象进行存根是有效的。我在示例中添加了简单的PersonPersonHelper类,测试通过了:

import spock.lang.Specification

class ExampleSpec extends Specification {

    def "should return second value of list of return values"() {
        given:
        Person personBob = Mock()
        Person personJackson = Mock()
        PersonHelper stubbedPerson = Stub()

        stubbedPerson.getNameOfBrother(personBob) >> "Billy Bob";
        stubbedPerson.getNameOfBrother(personJackson) >> "Tommy Jackson";

        when:
        String actual = stubbedPerson.getNameOfBrother(personBob)
        String actual2 = stubbedPerson.getNameOfBrother(personJackson)

        then:
        actual == "Billy Bob" // true
        actual2 == "Tommy Jackson" // false "Billy Bob"
    }

    static class Person {
        String name
    }

    static class PersonHelper {
        String getNameOfBrother(Person person) {
            return null
        }
    }
}

我已经用spock-core:1.1-groovy-2.4spock-core:1.0-groovy-2.4甚至spock-core:0.7-groovy-2.0检查了它。都起作用了。

但更重要的是--这样的测试没有任何意义。你根本不测试你的代码。您只测试模仿框架是否正确模仿。如果您在生产代码中使用Spock mocks,这个测试可能会有一些意义,但这不是一个有效的假设。

 类似资料:
  • 我在这件事上纠结了一段时间。是否可以模拟新URL(URL)。openStream()返回一个文件。广州?我正在使用斯波克来尝试这样做。 测试类 或者我最好编写一个私有方法来返回流?

  • 给定一个类Foo 为什么我用Spock来嘲笑Foo 调用总是返回false? 不确定这是否有区别,但测试是在Groovy/Spock中进行的,而Foo是在Java8中进行的。

  • 您可以在下面找到整个应用程序:https://github.com/ahlinist/raspberry-pi4j/tree/feature/integration-tests 我试图实现以下描述的结果:https://github.com/spockframework/spock/blob/master/spock-spring/boot-test/src/test/groovy/org/spo

  • 我在spring boot应用程序中用groovy(spock)编写了一个集成测试。其中一个应用程序bean称为,它具有以下方法: 在类中还有其他方法。在我的集成测试中,我只想模拟该特定方法的响应。以以下方式: 我希望进行其他验证,但不是这次。基本上,我想实现这一点,但与斯波克。我想取消执行方法

  • 所以我想做一些事情 但我得到了空异常