Unit testing 为什么可以毫无问题地在Spock中测试私有方法/字段?

Unit testing 为什么可以毫无问题地在Spock中测试私有方法/字段?,unit-testing,methods,field,private,spock,Unit Testing,Methods,Field,Private,Spock,当我尝试在Spock方法中访问时: package com.example.dev; public class AClass { private Integer a =10; ...//other code } 它很好用。为什么会发生这种情况?Spock是否使用反射来访问私有字段?或者我在中的封装写得不好?斯波克无罪,这是groovy本身,请参见: 虽然可以提及班上的私人成员,但这绝对不是一个好的做法。我的理解是 package com.example.dev; def 'test a'()

当我尝试在Spock方法中访问时:

package com.example.dev;
public class AClass {
 private Integer a =10;
...//other code
}

它很好用。为什么会发生这种情况?Spock是否使用反射来访问私有字段?或者我在中的封装写得不好?

斯波克无罪,这是groovy本身,请参见:


虽然可以提及班上的私人成员,但这绝对不是一个好的做法。

我的理解是

package com.example.dev;
def 'test a'() {
 AClass aClassVar = new AClass()
 aClassVar.a = new Integer(100);
...//other testing stuff
}
在Groovy/Spock中,它只是语法上的糖

aClassVar.a = new Integer(100)
在Java中。我曾经尝试过这样做,但没有二传手,斯波克抱怨道


至于为什么我们创建私有属性,然后给它们设置器,那是另一个讨论。

为什么这不是一个好的实践?同样在将来,您认为groovy会取消对这个(访问私有方法)类内部的支持吗?如果我们可以测试私有方法,我们肯定也可以测试它们的契约(比如它们基于groovy的输入返回的内容)。如果将来,返回类型etc发生变化,那么测试当然会失败。即使对于公共方法也是如此。我还是不明白这怎么是个坏习惯?也许你的意思是说,通过测试私有方法(使用groovy的魔法语法等),它可能不安全?我们不会仍然存根底层服务,只测试getData的契约吗?如果契约发生变化,那么重做测试是一个有效的场景。我的意思是,即使原本应该是私有的方法(getData)最终成为公共的,或者使用groovymagic进行测试,我们仍然会遵循测试约定,只测试它的契约,对吗?仅仅因为它是一个私有方法,并不意味着我们将打破单元测试惯例。对不起,如果我误解了。谢谢你的回复。:)如果getData确实应该是公开的,并且我们按照您所说的做了,那么我们的测试约定就不好了。在进行单元测试时,我们为什么不删除基于Http的内部构件或方法所需的其他依赖项?在这个单元测试期间,我们不应该只测试getData,假设所有依赖项都按照它们的约定工作(我指的是http方法)。@theprogrammer,也请参阅和及其注释,了解为什么不应该对私有方法进行单元测试。
aClassVar.setA(new Integer(100));