【发布时间】:2018-05-07 18:24:51
【问题描述】:
这似乎很基本,所以我认为这是一个骗局......但我还没有找到任何可以回答这个问题的东西。
我的应用代码也是 Groovy。说我有一个字段
def something
在我的测试中(CUT 是 Spock Spy)我运行了一个中间有一行的方法
something = null
或
something = new Bubble()
...我只是想找到一种方法来测试确实设置为null(或任何值...)
在我尝试过的then 块中:
1 * spyCUT.setSomething( null )
和
1 * spyCUT.setSomething(_)
和
1 * spyCUT.set( 'something', _ )
顺便说一句,为了回答我可以在then 块中测试something 的值的反对意见,情况是something 意味着首先设置为一个值,然后设置为另一个值这个方法的过程...
阅读了Groovy In Action 2nd Ed,我对 Groovy 如何处理获取和设置字段有最模糊的概念......显然还不够。
MCVE(FWIW!)
class Spocko {
def something
def doStuff() {
something = 'fruit'
}
}
class SpockoTest extends Specification {
def 'test it'(){
given:
Spocko spySpocko = Spy( Spocko )
when:
spySpocko.doStuff()
then:
1 * spySpocko.setSomething(_)
}
}
稍后(在 kriegaex 非常有帮助的回复之后)
上面的SpockTest setSomething 被调用:
class Spocko {
def something
def doStuff() {
this.each{
it.something = 'fruit'
}
}
}
...通过!我现在正试图理解为什么......
顺便说一句,我还发现以下通过(并且没有关闭):
1 * spySpocko.setProperty( 'something', _ )
【问题讨论】:
-
恕我直言,没有冒犯的意思:迈克,你什么时候才能学会向MCVEs 提供你的问题?这真的不好玩,我总是必须从你不连贯的 sn-ps 集中拼凑可复制的测试用例。帮助别人帮助你,改善你的提问方式——拜托,拜托。 P.S.:您阅读了很多规范和工具源代码,试图做一些棘手的事情。为什么?保持简单,使用干净的代码并使您的代码可测试。我保证,您会享受结果并节省大量时间。
-
@kriegaex 感谢您的回复。但是......在这种情况下提供 MCVE 是愚蠢的:MCVE 在我描述的内容中是明确的:您可以使用一个 10 行的 Groovy 应用程序文件和一个 10 行的 Spock 测试文件。您甚至可以将它们放在同一个文件中。但是无论如何,您没有义务回答任何问题。或者你可以相信我得到了我描述的结果(在最简单的可以想象的情况下)。
-
我不知道你所说的“棘手的事情”是什么意思。当我开发这个项目时,我正在旋转由一个非常“严格”的 TDD 逻辑驱动的测试(规范/功能):我希望我的应用程序类做一些他们还没有做的事情,并问自己如何“提出”这个问题.我的大多数测试实际上并不是单元测试,它们更像是功能测试,并且开发是渐进式的,从不“激进”。如果您不喜欢我提出的问题,最好的办法就是忽略它们...
-
也许更重要的是,关于这一点,问题很简单:Spock 可以对运行时生成的方法应用模拟吗? (AST 方法 - 至少我认为 getter 和 setter 属于这一类......?)。想要对此进行测试并非没有道理。这可能会也可能不会,但我不认为它本质上是“棘手的”。
-
看到了吗?提供MCVE 并不难,您让我很容易回答您的问题。谢谢你。 :-) 为什么要写三个关于你为什么不想改进你的问题的 cmets?这不是我个人的想法,MCVE 链接(如果你曾经打开过它)是关于如何在这里提问的 StackOverflow 指南。你写多少散文来描述问题,它只是支持你的情况,但容易产生误解。让代码说话!
标签: groovy field spock getter-setter