Why can test private methods/fields in Spock witho

2019-03-22 00:14发布

问题:

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

and when I try to access a in my Spock method:

package com.example.dev;
def 'test a'() {
 AClass aClassVar = new AClass()
 aClassVar.a = new Integer(100);
...//other testing stuff
}

It works fine. Why this happens? Is Spock use reflection for accessing the private fields? Or my encapsulation in not written well?

回答1:

Spock isn't guilty, it's groovy itself, see: Private method in groovy is not private.

While it's possible to refer to private members of class, it's definitely not a good practice.



回答2:

It's my understanding that

aClassVar.a = new Integer(100)

in Groovy / Spock is just syntactic sugar for

aClassVar.setA(new Integer(100));

in Java. There have been occasions where I tried to do that and there WASN'T a setter and Spock griped.

As for why we create private attributes and then give them setters, THAT is another discussion.